2014-05-06 61 views
2

我有模型,它具有IEnumerable屬性。如何在MVC模型中驗證IEnumerable <string>屬性4

public class SendEmailModel 
{ 
    [Required] 
    [RegularExpression(Helper.DefaultEmailValidationPattern, ErrorMessageResourceName = "InvalidValue", ErrorMessageResourceType = typeof(i18n))] 
    public IEnumerable<string> Recipients { get; set; } 

    [RegularExpression(Helper.DefaultInputValidationPattern, ErrorMessageResourceName = "InvalidValue", ErrorMessageResourceType = typeof(i18n))] 
    public string Subject { get; set; } 
    ... 
} 

鑑於

@using (Ajax.BeginForm("SendEmail", "Admin", new AjaxOptions { LoadingElementId = "loadingPane" }, new { id = "SendEmailForm"})) 
{ 
    <div class="custom-validation-summary-errors"></div> 

    <div> 
     @Html.LabelFor(m => m.Recipients, i18n.To): 
    </div> 

    for (int i = 0; i < 10; i++) 
    { 
     <div> 
      @Html.EditorFor(m => m.Recipients, "String") 
     </div> 
    } 

    <div class="mt20"> 
     @Html.LabelFor(m => m.Subject, i18n.Subject): 
    </div> 
    <div> 
     @Html.EditorFor(m => m.Subject, "String") 
    </div> 

    ... 

    <input type="submit" value="Send"/> 
} 

但發佈表單驗證時不能正常工作。發佈後,我得到ModelState.IsValid - false。

編輯: 我試圖利用不顯眼的驗證。對主題的驗證正在工作(用戶不能發表帶有無效主題的表單)

for循環將被替換爲jquery添加/刪除收件人。

+0

你能發佈完整的視圖和操作嗎? –

+0

已更新的問題 –

回答

3

您不能在IEnumerable<T>類型的屬性上使用驗證數據註釋。通過創建綁定到Recipient的局部視圖

public class Recipient 
{ 
    [RegularExpression(Helper.DefaultEmailValidationPattern, ErrorMessageResourceName = "InvalidValue", ErrorMessageResourceType = typeof(i18n))] 
    public string EmailAddress { get; set; } 
} 

,然後在主視圖模型,

public class SendEmailModel 
{ 
    [Required] 
    public IEnumerable<Recipient> Recipients { get; set; } 

    ... 
} 

現在你可以爲你Recipient類中創建一個editor template:您可以創建一個包裝類代替如下,像這樣:

@Html.TextBoxFor(model => model.EmailAddress) 

現在,勢必SendEmailModel你的主視圖,你可以這樣做:

@Html.EditorForModel 

這將爲每個屬性創建一個編輯器。在這種情況下,該屬性的類型爲IEnumerable<Recipient>,因此它將爲該列表中的每個項目創建一個編輯器模板(如前所定義)。所有驗證將自動應用。

Here是一個類似的討論。

1

只是一個想法,但如何創建一個旁路屬性?

大概可以做這樣的事情

string RecipienctsCsv { 
get 
{ 
    return string.Join(', ', Recipiencts); 
} 
} 

再說你沒有表現出足夠的代碼來驗證羯羊,這將是對你還是不是一個選項。另一種選擇是擴展HtmlHelper以使其適用於IEnumerable