当没有从下拉列表中选择任何值时,获取modelstate false

时间:2015-02-14 06:47:15

标签: c# asp.net-mvc asp.net-mvc-4

我在我的网站中有两个角色客户和供应商

现在当供应商正在进行注册时,我提供从下拉列表控件中选择类别的选项.Category可以如下:水管工,电气,裁缝,木匠等......

此类别已加载到下拉列表中,供应商可从中选择适当的类别。

    [Required(ErrorMessage = "Please Select City")]
    [DataMember]
    public int CategoryId { get; set; }

我在我的注册页面上为供应商和客户提供了单选按钮选项。如果用户选择供应商,那么我显示类别下拉列表,如果用户选择客户,则我不显示此下拉列表。

因此,当用户提交表单时,这就是我在控制器上所做的事情:

 [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; }
    }

问题是当用户选择客户选项然后我得到的模型状态为假,因为在客户的情况下,categoryid将为空(因为我没有向客户显示类别下拉列表)。 / p>

那我如何解决这个问题?

任何帮助......

4 个答案:

答案 0 :(得分:0)

添加新类别“none”并将其设为默认值。之后,你可以测试它......

答案 1 :(得分:0)

您需要为下拉列表设置默认选定值,如下所示 -

设置选中="选择"对于您希望成为默认选项。

<option value="0" selected="selected">
None
</option>

这将在隐藏时为控件选择默认值,并且对于下拉字段,modelstate将为true。

答案 2 :(得分:0)

向模型添加属性以指示用户是客户还是供应商,并应用foolproof [RequiredIf]属性。如果UserType的单选按钮的值为&#34;供应商&#34;,则如果没有&#34; City&#34;则会显示错误。已被选中。

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" />
}

答案 3 :(得分:-1)

您必须将int更改为int?

所以你最终得到了这段代码:

public int? CategoryId { get; set; }

所有值类型都会发生这种情况。

其他信息 当请求到达控制器时,模型绑定器将实例化一个新对象,因此CategoryId将被设置为0(它不能为空),因此Required属性不知道该0是否来自请求因此它总是有效的。这就是Nul​​lable int?将起作用的原因。

多年来很多人都认为它是按照设计工作的,但在MVC 6上,他们将其标记为一个bug。问题如下:https://github.com/aspnet/Mvc/issues/1971