2014-12-19 98 views
2

我正在使用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意味着我需要抛出像“它是必需的”字段验证。

我尝试加入[必需的]字段验证程序。它是一个具有一些空字符串值作为下拉值的集合,因此我不知道如何使用[必需的]字段进行收集,其中有空字符串。 我不想允许空字符串下拉。

我该如何验证?

+0

显示如何在视图中生成下拉列表和'IList “ – 2014-12-19 09:45:26

+0

@stephen更新了视图代码 – SivaRajini 2014-12-19 09:47:15

+2

如果将其更改为”@ Html.DropDownListFor(x => x.AssignedUserName,Model。PossibleAssignees,“ - 请选择 - ”)'它会渲染第一个选项的空值,如果选中将触发验证错误 – 2014-12-19 09:48:28

回答

2

不要将emtpty字符串分配给列表中的值,而是将其用作默认值,并且[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; 
    } 
} 
+0

sorry.i不能理解这个 – SivaRajini 2014-12-19 09:52:38

+0

添加String.Empty到下拉列表有什么用处 – SivaRajini 2014-12-19 09:54:17

+0

@ PossibleVisignees中的@SivaRajini不包括空字符串。 'String.Empty'将作为默认值并验证为没有任何选择 – FabioG 2014-12-19 09:55:24

1

或者,您也可以使用自定义的模型绑定.eg

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。当您渲染视图时,会在拨打电话ValidationMessageFor()的位置显示文本“No assignee selected”。

所以有选择可以实现你所需要的。