我正在使用带有jquery unobtrusive验证的asp.net mvc 3。我最近从标准DataAnnotations更改为FluentValidation,它运行良好。
我获取FluentValidation的主要原因是需要在我的viewmodel上验证嵌套属性(但我发现还有其他很酷的理由使用它),看起来像这样(不介意访问器这是伪的):< / p>
class Vm {
string Prop;
string AnotherProp;
IEnumerable<ElementsVm> Elements;
}
class ElementsVm {
bool Required;
string Id;
string Title;
string Value;
}
使用FluentValidation我为Vm和ElementVm制作验证器,我的单元测试是绿色的,显示服务器端验证正在运行。
客户端,'Prop'和'AnotherProp'正在运行 - 我的验证规则也按预期运行客户端(与DataAnnontation一样),但我的所有元素都没有得到任何客户端验证 - 我检查dom,可以看到所有data-val,data-required等属性都缺失。
我尝试过在我的视图中生成html的不同方法,但是'Prop'和'AnotherProp'是使用Html.TextBoxFor(m =&gt; m.Prop)生成的,而我的元素是在部分生成的 - 这就是问题的起点。如果我选择Html.TextBoxFor(m =&gt; m.Value)我的所有元素文本框将具有相同的名称/ ID,所以我也尝试使用Html.TextBox(Model.Id)生成唯一的id / name但仍然没有验证属性。
有没有办法使我的senario工作 - 我不介意重写它,但我真的希望FluentValidation为我编写我的HTML。
我的后备解决方案是让我自己的Html帮助程序生成带有属性的正确Html,但我认为这很糟糕,因为当FluentValidation,jquery的新版本/补丁发布时我将不得不继续更新这些帮助程序验证或两者之间的mvc链接。
答案 0 :(得分:8)
在partial,在每个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