嵌套(集合)属性的mvc客户端验证

Per*_*eck 6 unobtrusive-validation asp.net-mvc-3

我正在使用asp.net mvc 3和jquery unobtrusive验证.我最近从标准DataAnnotations改为FluentValidation,它运行良好.

我获取FluentValidation的主要原因是需要验证我的viewmodel上的嵌套属性(但我发现还有其他很酷的理由使用它),有点看起来像这样(不介意访问器这是伪的):

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

class ElementsVm {
  bool Required;
  string Id;
  string Title;
  string Value;
}
Run Code Online (Sandbox Code Playgroud)

使用FluentValidation我为Vm和ElementVm制作验证器,我的单元测试是绿色的,显示我的服务器端验证工作正常.

客户端,'Prop'和'AnotherProp'正在运行 - 我的验证规则也按预期运行客户端(就像他们使用DataAnnontation一样),但我的所有元素都没有得到任何客户端验证 - 我检查dom并且可以看到所有data-val,data-required等属性都缺失.

我尝试过在我的视图中生成html的不同方法,但是'Prop'和'AnotherProp'是使用Html.TextBoxFor(m => m.Prop)生成的,而我的元素是在部分生成的 - 这是问题开始了.如果我选择Html.TextBoxFor(m => m.Value)我的所有元素文本框将具有相同的名称/ id,所以我也尝试使用Html.TextBox(Model.Id)生成唯一的id/name但仍然没有验证属性.

那么有没有办法使我的senario工作 - 我不介意重写它,但我真的希望FluentValidation为我写我的HTML.

我的后备解决方案是让我自己的Html帮助器生成带有属性的正确Html,但我觉得这很糟糕,因为当FluentValidation,jquery验证或者新版本发布/补丁时,我将不得不继续更新这些帮助器.在两者之间的mvc链接.

cou*_*ben 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++; 
}
Run Code Online (Sandbox Code Playgroud)

这应该为您提供不显眼的验证属性,并且还应该使用默认的模型绑定器.

counsellorben