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

时间:2011-04-01 09:16:01

标签: unobtrusive-validation asp.net-mvc-3

我正在使用带有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链接。

1 个答案:

答案 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