【问题标题】:getting modelstate false when no value is selected from dropdown当从下拉列表中未选择任何值时,模型状态为 false
【发布时间】:2015-02-14 06:47:15
【问题描述】:

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

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

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

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

所以问题是当用户选择客户选项时,我将 modelstate 设为 false,因为在客户的情况下 categoryid 将为空(因为我没有向客户显示类别下拉列表)

那么我该如何解决呢?

任何帮助....

【问题讨论】:

  • 您可以查看使用 foolproof [RequiredIf] 属性或其他允许基于另一个属性进行条件验证的属性之一。
  • 但是我如何为客户或供应商检查这个以及在哪里??
  • 您甚至没有向您展示模型或与供应商/客户关联的属性是什么,但[RequiredIf] 有多种版本,例如如果它的bool IsVendor,那么您可以使用@987654328 @ 只有在您选择“供应商”时才会添加错误 - 您需要阅读文档并查看一些示例。
  • 请查看我的已编辑问题。我只有 1 个模型供客户和供应商使用。
  • 您尚未显示用于确定用户是供应商还是客户(用于呈现单选按钮的那个)的属性

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


【解决方案1】:

向您的模型添加一个属性以指示用户是客户还是供应商并应用 foolproof [RequiredIf] 属性。如果UserType 的单选按钮的值为“供应商”,则如果没有选择“城市”,则会显示错误。

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

【讨论】:

  • 非常感谢先生。继续这样的帮助。再次感谢你
  • 先生最后一个问题。我能问你吗??
  • 问题是什么?
  • 先生,我正在学习 Angular js,所以我用 MVC 创建了 1 个关于 Angular js 的演示项目,其中包含 crud 操作(插入、更新和删除)。所以我只想发布我的 Dropbox onstackoverflow 的链接其中包含我要下载的演示项目和我在项目中面临的一些问题。所以我可以发布这样的问题吗?
  • 不,您的问题需要包含与问题相关的相关代码。如果您只包含一个链接,它将被否决并关闭(而且无论如何都不太可能有人会查看它)
【解决方案2】:

添加一个新类别“无”并将其设为默认值。之后,您可以对其进行测试...

【讨论】:

  • 避免这样做。您丢失了客户端验证,需要依赖服务器端检查,然后添加模型状态错误并返回视图。
【解决方案3】:

您需要像这样为下拉菜单设置默认选择值-

为您希望成为默认选项的选项设置 selected="selected"。

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

这将在隐藏时为控件选择默认值,并且下拉字段的模型状态将为真。

【讨论】:

  • 我已经这样做了:List categories = new List().ToList();categories.Add(new SelectListItem() { Text = "Select Category", Value = "0" });
【解决方案4】:

您必须将您的 int 更改为 int?

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

public int? CategoryId { get; set; }

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

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

多年来一直如此,很多人认为这是设计使然,但在 MVC 6 上,他们将其标记为错误。这是问题:https://github.com/aspnet/Mvc/issues/1971

【讨论】:

  • 真的尝试使用可为空的 int 并且如果角色是供应商并且 categoryid == nullModelState.IsValid 之前在控制器上手动执行 ModelState.AddModelError()
  • 但这将在我的发布操作被触发后完成,但我不想这样做。请参阅@Stephen Muecke cmets。
猜你喜欢
  • 2020-10-13
  • 2018-06-18
  • 1970-01-01
  • 2016-04-17
  • 1970-01-01
  • 2011-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多