Asp.net mvc Dropdownlistfor返回空值

Asp.net mvc Dropdownlistfor返回空值,asp.net-mvc,html-helper,Asp.net Mvc,Html Helper,我有一个具有属性性别的customer类。我创建了一个性别类型列表,其中包含身份证号码和性别类型。当表单提交时,我得到的是空值 查看 @model MovieRentals.ViewModel.CustomerView <div class="form-group"> <h4>@Html.LabelFor(l => l.Customer.BirthDate)</h4> @Html.DropDownListFor(l => l.Cus

我有一个具有属性性别的customer类。我创建了一个性别类型列表,其中包含身份证号码和性别类型。当表单提交时,我得到的是空值

查看

@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>
@model MovieRentals.ViewModel.CustomerView
@LabelFor(l=>l.Customer.BirthDate)
@DropDownListFor(l=>l.CustomerGender,新选择列表(Model.CustomerGender,“GenderId”,“GenderType”),“选择性别”,新{@class=“form control”})
型号

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; }
}
公共类CustomerView
{
公共IEnumerable成员身份类型{get;set;}
公共客户客户{get;set;}
公共列表CustomerGender{get;set;}
}
公共类性别类
{
public int GenderId{get;set;}
公共字符串性别类型{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);
    }
public ActionResult New()
{
var MembershipTy=_context.MemebershipType.ToList();
var ViewModel=new CustomerView();
ViewModel.CustomerGender=新列表()
{
新的GenderClass(){GenderId=1,GenderType=“Male”},
新的GenderClass(){GenderId=2,GenderType=“Female”}
};
ViewModel.MembershipTypes=成员资格;
返回视图(ViewModel);
}

您需要两个属性:一个用于保存选定值,另一个用于保存选项。保存选项的应该是
IEnumerable
。你的
GenderClass
课程是完全多余的

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

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" }
        }
    }
}
或者,如果要使用枚举:

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)

显然,第二个版本的含义要明显得多。

您需要两个属性:一个用于保存选定值,另一个用于保存选项。保存选项的应该是
IEnumerable
。你的
GenderClass
课程是完全多余的

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

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" }
        }
    }
}
或者,如果要使用枚举:

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)

显然,第二个版本的含义要明显得多。

因为您使用的是与数据源相同的属性并保存选择。您需要一个不可枚举的属性来保存所选的值。您不能将
绑定到复杂对象的集合-它会发回单个值。您需要将属性绑定到-say
public int-SelectedGender{get;set;}
@Html.DropDownListFor(l=>l.SelectedGender,new-SelectList(…
select标记
name
属性必须与对象中的属性匹配,只有在MVC框架正确绑定该值后,才可以。因此,请检查select标记的名称,并确保您在模型中具有相同的属性名。因为您使用的属性与数据源相同,并且要保留选择。您需要非-用于保存所选值的可枚举属性。您不能将
绑定到复杂对象的集合-它回发单个值。您需要将属性绑定到-say
public int SelectedGender{get;set;}
@Html.DropDownListFor(l=>l.SelectedGender,new SelectList(…
select标记
name
属性必须与对象中的属性匹配,只有在MVC框架将该值正确绑定后,才能使用该属性。因此,请检查select标记的名称,并确保模型中的属性名称相同。