2012-08-27 53 views
7

使用EditorFor與IEnumerable的 我有一個包含一個IEnumerable字符串,使用數據註釋進行驗證: 在MVC 3

[Required(ErrorMessage = "This is required.")] 
[Remote("IsValid", "ControllerName")] 
public IEnumerable<string> MyList { get; set; }  

我然後用這個用一個編輯模板。這是我如何把它在我的觀點:

@Html.EditorFor(m => m.MyList) 

最後,我的模板藉此IEnumarable,併爲每個元素數量的表單元素:

@model IEnumerable<string> 
@foreach (var str in Model) 
{ 
    <li> 
     @Html.LabelFor(m => str, "My Label") 
     @Html.TextBoxFor(m => str) 
     @Html.ValidationMessageFor(m => str) 
    </li> 
} 

即使表單元素都正確地呈現,我是否正確接近?另外,我注意到它不再驗證。我該如何解決這個問題?

回答

7

你正在以「正確」的方式去做。 (正確的,它可以工作,我以前做過)但通過驗證我認爲它不工作的原因是這樣的,你有IEInmerable而不是字符串的驗證。 驗證每個字符串。你將不得不創建一個新的模型對象說

public class LabelString 
{ 
    [Required(ErrorMessage = "This is required.")] 
    public string labelName { get; set; } 
} 

然後,你必須public IEnumerable<string> MyList { get; set; }public IEnumerable<LabelString> MyList { get; set; }

這應該給你的每一個標籤驗證在for循環替換它。

3

它不是一個數學,所以有超過1個解決方案,您的問題和沒有一個正確的

說,不過,我寧願接近它是不同的:

public class StringsViewModel 
{ 
    IEnumerable<string> myList; 
} 

在視圖中,你需要再

@model StringsViewModel 
@EditorForModel() 

它將驗證,因爲你現在已經強類型模型而不是通用的。 另外,你節省了foreach循環,這是由框架自動完成的...

希望這會有所幫助。