【问题标题】:Not Allow drop down null value selected不允许选择下拉空值
【发布时间】:2014-12-19 09:43:35
【问题描述】:

我正在使用 MVC4 应用程序。下面是我的模型

    public class ViewModel
        {
public string AssignedUserName { get; set; }
          public IList<SelectListItem> PossibleAssignees { get; set; }

            [Required]
            public string Comment { get; set; }
    }

查看:

<table style="width: 100%; ">
        <tr>
            <td>Assigned To:</td>
            <td>@Html.DropDownListFor(x => x.AssignedUserName, Model.PossibleAssignees)</td>
            <td>@Html.ValidationMessageFor(m => m.AssignedUserName, "Assigned To Required")</td>
<tr></table>

PossibleAssignes 是一个下拉菜单,值应该是 -> EmptyString,"Mr.Barr"。

因此,如果用户选择 EmptyString 意味着我需要像“它是必需的”字段一样抛出验证。

我尝试添加 [Required] 字段验证器。它是一个集合,其中包含一些空字符串值作为下拉值, 所以我不确定如何使用 [Required] 字段来收集具有空字符串的集合。 我不想让空字符串用于下拉菜单。

我如何验证这一点?

【问题讨论】:

  • 显示如何在视图中生成下拉列表和IList&lt;SelectListItem&gt;
  • @stephen 更新了查看代码
  • 如果您将其更改为@Html.DropDownListFor(x =&gt; x.AssignedUserName, Model.PossibleAssignees, "--Please select--"),它将使用空值呈现第一个选项,如果选中则会触发验证错误
  • 您还需要将[Required] 属性添加到属性AssignedUserName
  • @stephen 它将在下拉菜单中添加“请选择”。我不想要这个选项

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


【解决方案1】:

不要为列表中的值分配空字符串,而是将其用作默认值,[Required] 就可以正常工作。 在您看来,将其用作:

@Html.DropDownListFor(x => x.AssignedUserName, Model.PossibleAssignees, String.Empty)

在您的视图模型中:

public class ViewModel
{
      [Required]
      public string AssignedUserName { get; set; }
      public IList<SelectListItem> PossibleAssignees { get; set; }

      [Required]
      public string Comment { get; set; }
}

编辑(我会留下我的第一个答案,因为它可能对其他人有用)

您可以进行自定义验证:

public class ViewModel
{
      [Required]
      [ValidateAssignedUserName()]
      public string AssignedUserName { get; set; }
      public IList<SelectListItem> PossibleAssignees { get; set; }

      [Required]
      public string Comment { get; set; }
}

[AttributeUsage(AttributeTargets.Property, AllowMultiple = true, Inherited = true)]
public sealed class ValidateAssignedUserName : ValidationAttribute
{
    private const string _defaultErrorMessage = "Select a user.";

    public ValidateAssignedUserName()
        : base(_defaultErrorMessage)
    { }

    public override bool IsValid(object value)
    {
        string user = value as string;

        if (user != null && user.Length > 0)
        {
            return true;
        }

        return false;
    }
}

【讨论】:

  • 对不起,我无法理解
  • 将String.Empty添加到下拉菜单有什么用
  • @SivaRajini in PossibleAssignees 不包括空字符串。 String.Empty 将作为默认值工作并验证为未选择任何内容
  • 实际上是来自远程服务的价值。所以它将是绑定模型
  • @SivaRajini 您可以进行自定义验证检查我的答案的编辑部分
【解决方案2】:

或者,您也可以使用自定义模型绑定器.e.g

public class ViewModelBinder : DefaultModelBinder
{
    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        var model = base.BindModel(controllerContext, bindingContext) as ViewModel;

        if (model.AssignedUserName == "-1")
            bindingContext.ModelState.AddModelError("AssignedUserName", "No assignee selected");

        return model;
    }
}

Global.asax.cs

protected void Application_Start()
{
    // .....
    ModelBinders.Binders.Add(typeof(ViewModel), new ViewModelBinder());
    // ....
}

稍微改变你的看法:

&lt;td&gt;@Html.ValidationMessageFor(m =&gt; m.AssignedUserName)&lt;/td&gt;

从上述行的第二个参数中删除文本。

执行上述操作将导致ModelState.IsValid 被设置为false。渲染视图时,在进行ValidationMessageFor() 调用的位置会出现“未选择受让人”文本。

所以有一些选项可以满足您的需要。

【讨论】:

    猜你喜欢
    • 2017-11-04
    • 2018-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-23
    • 1970-01-01
    • 2011-03-13
    相关资源
    最近更新 更多