当没有从下拉列表中选择任何值时,模型状态为 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" />
}