2011-04-01 117 views
6

我使用的是asp.net mvc 3 jQuery不顯眼的驗證。我最近從標準DataAnnotations更改爲FluentValidation,它工作得很好。嵌套(集合)屬性mvc clientside驗證

我選擇FluentValidation的主要原因是需要驗證我的viewmodel的嵌套屬性(但我發現還有其他很酷的使用它的理由),看起來像這樣(不介意這是僞參數):

class Vm { 
    string Prop; 
    string AnotherProp; 
    IEnumerable<ElementsVm> Elements; 
} 

class ElementsVm { 
    bool Required; 
    string Id; 
    string Title; 
    string Value; 
} 

使用FluentValidation我做一個驗證的虛擬機和ElementVm和我的單元測試是綠色的,我展示服務器端驗證工作。客戶端,'Prop'和'AnotherProp'正在工作 - 我的驗證規則也像預期的那樣運行在客戶端(與DataAnnontation一樣),但是我的所有元素都沒有得到任何客戶端驗證 - 我檢查了DOM,並可以看到所有的數據val,數據需求等屬性丟失。

我已經嘗試了不同的方法來在我的視圖中生成html,但'Prop'和'AnotherProp'是使用Html.TextBoxFor(m => m.Prop)生成的,而我的元素是在部分生成的 - 這是問題開始的地方。如果我選擇Html.TextBoxFor(m => m.Value),所有我的元素文本框將具有相同的名稱/ ID,因此我也嘗試使用Html.TextBox(Model.Id)生成唯一的ID /名稱,但仍然沒有驗證屬性。

所以,有沒有辦法讓我的參議員工作 - 我不介意重寫一下,但我真的很喜歡FluentValidation爲我寫我的HTML。

我的備用解決方案是讓我自己的Html幫助器生成帶有屬性的正確Html,但這會吸引我認爲,因爲當新版本/補丁發佈到FluentValidation時,我將不得不更新這些幫助器, jQuery的驗證或兩者之間的MVC鏈接。

回答

8

在你的部分,ElementsVM的每個實例之前,您必須設置使用ViewData.TemplateInfo.HtmlFieldPrefix唯一的前綴,像這樣:

var i = 0; 
foreach (var element in Model) 
{ 
    ViewData.TemplateInfo.HtmlFieldPrefix = "Elements[" + i.ToString() + "]"; 
    @Html.TextBoxFor(m => m.Value) 
    i++; 
} 

這應該給你不顯眼的驗證屬性,也應努力與默認的模型綁定。

counsellorben

+0

謝謝!這是有效的,應該被標記爲答案。 – JustinP8 2011-04-22 17:25:18

+1

此外,如果循環後有輸入,請不要忘記重置'ViewData.TemplateInfo.HtmlFieldPrefix =「''。 – JustinP8 2011-04-22 17:39:27

+0

@ JustinP8,@counsellorben,@Per:我有同樣的問題,但是這並沒有解決它。我爲我的嵌套集合使用EditorTemplates,並且所有'input'標籤的'id'屬性都已經用適當的/等價的「Elements [0]」作爲前綴。 'ViewData.TemplateInfo.HtmlFieldPrefix'很方便知道,但對我來說不是問題。 @Per提到'data-val,data-required等屬性缺失'。我注意到了同樣的事情。 – tkerwood 2011-06-09 07:52:33