当没有从下拉列表中选择任何值时,模型状态为 false
getting modelstate false when no value is selected from dropdown
我在我的网站中有两个角色:客户和供应商
现在,当供应商进行注册时,我会在下拉列表控件中为selecting类别提供选项。类别可以如下:水管工、电工、裁缝、木匠等...
此类别已加载到供应商可以从中select适当类别的下拉列表中。
[Required(ErrorMessage = "Please Select City")]
[DataMember]
public int CategoryId { get; set; }
我在注册时为供应商和客户提供了单选按钮选项 page.so 如果用户是 selecting 供应商,那么我将显示类别下拉列表,如果用户是 selecting 客户那我就不显示这个下拉菜单了。
所以当用户提交表单时,这就是我在我的控制器上所做的:
[HttpPost]
public ActionResult Registration(UserDetailsModel _userDetails)
{
if(ModelState.IsValid)
{
}
else
{
//Error..
}
}
我的模特:
public class UserDetailsModel
{
[DataMember]
public int Id { get; set; }
[Required(ErrorMessage = "Please Enter Name")]
[DataMember]
public string Fullname { get; set; }
[Required(ErrorMessage = "Please Select City")]
[DataMember]
public int CategoryId { get; set; }
}
所以问题是当用户 selecting 客户选项时我得到的 modelstate 为 false 因为在客户的情况下 categoryid 将为空(因为我没有显示类别下拉列表给客户).
那么我该如何解决这个问题?
任何帮助....
添加一个新类别 "none" 并将其设为默认值。之后,您可以对其进行测试...
您必须将 int
更改为 int?
。
所以你最终得到这个代码:
public int? CategoryId { get; set; }
所有值类型都会发生这种情况。
附加信息
当请求到达控制器时,模型绑定器将实例化一个新对象,因此 CategoryId 将设置为 0(它不能为空),因此 Required 属性不知道该 0 是否来自请求,因此使其始终有效的。这就是 Nullable int?
起作用的原因。
很多人认为这是设计使然,但在 MVC 6 上,他们将其标记为错误。这是问题所在:https://github.com/aspnet/Mvc/issues/1971
您需要像这样为下拉菜单设置默认 selected 值-
设置 selected="selected" 为您想要的默认选项。
<option value="0" selected="selected">
None
</option>
这将 select 隐藏时控件的默认值,并且下拉字段的模型状态将为真。
向您的模型添加 属性 以指示用户是客户还是供应商,并应用 foolproof [RequiredIf]
属性。如果 UserType
的单选按钮的值为 "Vendor",则如果没有选择 "City",则会显示错误。
public class UserDetailsModel
{
public int Id { get; set; }
[Required]
public string UserType { get; set; }
[Required(ErrorMessage = "Please Enter Name")]
[Display(Name = "Full name")]
public string Fullname { get; set; }
[RequiredIf("UserType", "Vendor", ErrorMessage = "Please Select City")]
[Display(Name = "City")]
public int? CategoryId { get; set; }
public SelectList CityList { get; set; } // suggest this rather than ViewBag
}
然后在视图中
@model UserDetailsModel
@using(Html.BeginForm())
{
@Html.RadioButtonFor(m => m.UserType, "Customer", new { id = "customer" })
@Html.Label("customer")
@Html.RadioButtonFor(m => m.UserType, "Vendor", new { id = "vendor" })
@Html.Label("vendor")
@Html.ValidationMessageFor(m => m.UserType)
@Html.LabelFor(m => m.UserName)
@Html.TextBoxFor(m => m.UserName)
@Html.ValidationMessageFor(m => m.UserName)
@Html.LabelFor(m => m.CategoryId)
@Html.DropDownListFor(m => m.CategoryId, Model.CityList, "-Please select-")
@Html.ValidationMessageFor(m => m.CategoryId)
<input type="submit" />
}
我在我的网站中有两个角色:客户和供应商
现在,当供应商进行注册时,我会在下拉列表控件中为selecting类别提供选项。类别可以如下:水管工、电工、裁缝、木匠等...
此类别已加载到供应商可以从中select适当类别的下拉列表中。
[Required(ErrorMessage = "Please Select City")]
[DataMember]
public int CategoryId { get; set; }
我在注册时为供应商和客户提供了单选按钮选项 page.so 如果用户是 selecting 供应商,那么我将显示类别下拉列表,如果用户是 selecting 客户那我就不显示这个下拉菜单了。
所以当用户提交表单时,这就是我在我的控制器上所做的:
[HttpPost]
public ActionResult Registration(UserDetailsModel _userDetails)
{
if(ModelState.IsValid)
{
}
else
{
//Error..
}
}
我的模特:
public class UserDetailsModel
{
[DataMember]
public int Id { get; set; }
[Required(ErrorMessage = "Please Enter Name")]
[DataMember]
public string Fullname { get; set; }
[Required(ErrorMessage = "Please Select City")]
[DataMember]
public int CategoryId { get; set; }
}
所以问题是当用户 selecting 客户选项时我得到的 modelstate 为 false 因为在客户的情况下 categoryid 将为空(因为我没有显示类别下拉列表给客户).
那么我该如何解决这个问题?
任何帮助....
添加一个新类别 "none" 并将其设为默认值。之后,您可以对其进行测试...
您必须将 int
更改为 int?
。
所以你最终得到这个代码:
public int? CategoryId { get; set; }
所有值类型都会发生这种情况。
附加信息
当请求到达控制器时,模型绑定器将实例化一个新对象,因此 CategoryId 将设置为 0(它不能为空),因此 Required 属性不知道该 0 是否来自请求,因此使其始终有效的。这就是 Nullable int?
起作用的原因。
很多人认为这是设计使然,但在 MVC 6 上,他们将其标记为错误。这是问题所在:https://github.com/aspnet/Mvc/issues/1971
您需要像这样为下拉菜单设置默认 selected 值-
设置 selected="selected" 为您想要的默认选项。
<option value="0" selected="selected">
None
</option>
这将 select 隐藏时控件的默认值,并且下拉字段的模型状态将为真。
向您的模型添加 属性 以指示用户是客户还是供应商,并应用 foolproof [RequiredIf]
属性。如果 UserType
的单选按钮的值为 "Vendor",则如果没有选择 "City",则会显示错误。
public class UserDetailsModel
{
public int Id { get; set; }
[Required]
public string UserType { get; set; }
[Required(ErrorMessage = "Please Enter Name")]
[Display(Name = "Full name")]
public string Fullname { get; set; }
[RequiredIf("UserType", "Vendor", ErrorMessage = "Please Select City")]
[Display(Name = "City")]
public int? CategoryId { get; set; }
public SelectList CityList { get; set; } // suggest this rather than ViewBag
}
然后在视图中
@model UserDetailsModel
@using(Html.BeginForm())
{
@Html.RadioButtonFor(m => m.UserType, "Customer", new { id = "customer" })
@Html.Label("customer")
@Html.RadioButtonFor(m => m.UserType, "Vendor", new { id = "vendor" })
@Html.Label("vendor")
@Html.ValidationMessageFor(m => m.UserType)
@Html.LabelFor(m => m.UserName)
@Html.TextBoxFor(m => m.UserName)
@Html.ValidationMessageFor(m => m.UserName)
@Html.LabelFor(m => m.CategoryId)
@Html.DropDownListFor(m => m.CategoryId, Model.CityList, "-Please select-")
@Html.ValidationMessageFor(m => m.CategoryId)
<input type="submit" />
}