不允许选择下拉空值

时间:2014-12-19 09:43:36

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

我正在使用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是一个下拉列表,值应为 - &gt; EmptyString,&#34; Mr.Barr&#34;。

因此,如果用户选择了EmptyString,则意味着我需要抛出类似&#34;它是必需的&#34;领域。

我尝试添加 [必需] 字段验证程序。它是一个集合,它有一些空字符串值作为下拉值, 所以我不知道如何使用 [必需] 字段进行具有空字符串的集合。 我不想让空字符串下拉。

我该如何验证?

2 个答案:

答案 0 :(得分:2)

不要为列表中的值指定一个emtpty字符串,而是将其用作默认值,[Required]将正常工作。 在您的视图中,将其用作:

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

并在您的viewmodel中:

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

答案 1 :(得分:1)

或者,您也可以使用自定义模型绑定器.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());
    // ....
}

略微更改您的观点:

<td>@Html.ValidationMessageFor(m => m.AssignedUserName)</td>

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

执行上述操作会导致ModelState.IsValid设置为false。在渲染视图时,文本&#34;没有选择受理人&#34;将显示ValidationMessageFor()来电的位置。

因此可以选择实现您的需求。