2014-12-19 99 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」。

所以有選擇可以實現你所需要的。