为什么下拉值在数据库 mvc razor 中总是 null

why is the dropdown value always null in database mvc razor

我正在创建注册表单,下拉列表中有一个名为性别的字段。当我从性别下拉列表中 select Male 或 Female 时,值将始终为 null 并且 return 验证消息 "Male or Female is not valid for the field"

控制器

 [HttpPost]
    [ValidateAntiForgeryToken]
    public async Task<ActionResult> Create([Bind(Include = "ID, FirstName,DOB,Gender")] AgentMaster agentMaster)
    {
        if (string.IsNullOrEmpty(Convert.ToString(agentMaster.Gender)))
        {
            ModelState.AddModelError("Gender", "Gender is required");
        }


        if (ModelState.IsValid)
        {
            db.AgentMasters.Add(agentMaster);
            await db.SaveChangesAsync();
            return RedirectToAction("Index");
        }

        return View(agentMaster);
    }

查看

@model A.Models.AgentMaster

 <div class="form-group">
        @Html.LabelFor(model => model.Gender, htmlAttributes: new { @class = "control-label col-md-2" })
        <div class="col-md-10">

            @Html.DropDownListFor(model => model.Gender, new SelectList(new[] { "Male", "Female" }),"--select--")
            @Html.ValidationMessageFor(model => model.Gender, "", new { @class = "text-danger" })
        </div>
    </div>

在模型中性别被指定为

public Nullable<short> Gender { get; set; }

当我使用断点调试代码时,[httppost] 中的性别值是空值,但是通过给定 1 或 0 就可以了。所以我在控制器中使用验证来转换为字符串,但它不起作用。我没有得到我需要改变的地方。任何人都可以帮助找到解决方案吗??

您生成的 <select> 回发了 string"Male""Female",无法绑定到 short

将 属性 更改为 string,或者如果您确实想要 short,则需要生成具有相应 ValueIEnumerable<SelectListItem>,例如

new List<SelectListItem>()
{
    new SelectListItem() { Value = "0", Text = "Male" },
    new SelectListItem() { Value = "1", Text = "Female" }
};

然而,将 Gender 存储为数值没有任何意义,属性 应该是字符串或枚举。