2011-04-01 137 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