Asp.net mvc Dropdownlistfor返回空值
我有一个具有属性性别的customer类。我创建了一个性别类型列表,其中包含身份证号码和性别类型。当表单提交时,我得到的是空值 查看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
@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 MARY1
或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 MARY1
或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)
显然,第二个版本的含义要明显得多。因为您使用的是与数据源相同的属性并保存选择。您需要一个不可枚举的属性来保存所选的值。您不能将
绑定到复杂对象的集合-它会发回单个值。您需要将属性绑定到-saypublic int-SelectedGender{get;set;}
和@Html.DropDownListFor(l=>l.SelectedGender,new-SelectList(…
select标记name
属性必须与对象中的属性匹配,只有在MVC框架正确绑定该值后,才可以。因此,请检查select标记的名称,并确保您在模型中具有相同的属性名。因为您使用的属性与数据源相同,并且要保留选择。您需要非-用于保存所选值的可枚举属性。您不能将
绑定到复杂对象的集合-它回发单个值。您需要将属性绑定到-saypublic int SelectedGender{get;set;}
和@Html.DropDownListFor(l=>l.SelectedGender,new SelectList(…
select标记name
属性必须与对象中的属性匹配,只有在MVC框架将该值正确绑定后,才能使用该属性。因此,请检查select标记的名称,并确保模型中的属性名称相同。