returns 空值的下拉列表

Dropdownlistfor returns null value

我有一个客户 class,性别 属性。我创建了一个性别类型列表,其中包含 ID 号和性别类型。提交表单时,我得到空值。

查看

@model MovieRentals.ViewModel.CustomerView
<div class="form-group">
    <h4>@Html.LabelFor(l => l.Customer.BirthDate)</h4>
    @Html.DropDownListFor(l => l.CustomerGender, new SelectList(Model.CustomerGender, "GenderId", "GenderType"), "Select Gender", new { @class = "form-control" })
</div>

型号

public class CustomerView
{
    public IEnumerable<MembershipType> MembershipTypes{ get; set; }
    public Customer Customer { get; set; }
    public List<GenderClass> CustomerGender{ get; set; }
}

public class GenderClass
{
    public int GenderId { get; set; }
    public string GenderType { get; set; }
}

控制器

public ActionResult New()
    {
        var MembershipTy = _context.MemebershipType.ToList();
        var ViewModel = new CustomerView();
        ViewModel.CustomerGender = new List<GenderClass>()
        {
            new GenderClass(){ GenderId = 1, GenderType = "Male"},
            new GenderClass() { GenderId = 2, GenderType = "Female"}
        };
        ViewModel.MembershipTypes = MembershipTy;
        return View(ViewModel);
    }

您需要两个属性:一个用于保存选定的值,一个用于保存选项。持有选项的那个应该是IEnumerable<SelectListItem>。你的GenderClassclass完全是多余的

此外,当该值的含义不明显时,使用整数 id 作为值没有意义。在这里,1 意味着 Male 的事实只存在于 New 动作中。在其他任何地方,您都必须重复此逻辑(这会引入错误机会,例如男性 10)。此外,如果您决定更改这些值,则必须记住在所有位置更改它们。如果你想使用整数 id,那么你应该在某处抽象出含义,可以是枚举、静态 class、数据库 table 等。更好的选择是将它保留为字符串,并仅使用下拉列表来强制对该字符串值进行规范化。

public string CustomerGender { get; set; }

public IEnumerable<SelectListItem> CustomerGenderChoices
{
    get
    {
        return new List<SelectListItem>
        {
            new SelectListItem { Value = "Male", Text = "Male" },
            new SelectListItem { Value = "Female", Text = "Female" }
        }
    }
}

那么,在您看来:

@Html.DropDownListFor(m => m.CustomerGender, Model.CustomerGenderChoices, "Select Gender", new { @class = "form-control" })

或者,如果您要使用枚举:

public enum Genders
{
    Male = 1,
    Female = 2
}

然后,在您的视图模型中,您只需要一个 属性,仅用于存储值:

public Genders CustomerGender { get; set; }

那么,在你看来,可以利用EnumDropDownListFor:

@Html.EnumDropDownListFor(m => m.CustomerGender, "Select Gender", new { @class = "form-control" })

作为一个枚举,存储的值将是一个 int,但这里的好处是你在这些整数值和它们的含义之间有一个强类型的关联。例如,而不是做这样的事情:

if (customer.CustomerGender == 1) // Male

你可以做到:

if (customer.CustomerGender == Genders.Male)

显然,第二个版本的意思要明显得多。