6

我正在使用带有 jquery 不显眼验证的 asp.net mvc 3。我最近从标准 DataAnnotations 更改为 FluentValidation 并且效果很好。

我选择 FluentValidation 的主要原因是需要验证我的视图模型上的嵌套属性(但我发现使用它还有其他很酷的原因),有点像这样(不要介意访问器,这是伪的):

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 => m.Prop) 生成的,而我的元素是部分生成的——这就是问题开始。如果我选择 Html.TextBoxFor(m => m.Value) 我所有的元素文本框都将具有相同的名称/id,所以我也尝试使用 Html.TextBox(Model.Id) 生成唯一的 id/名称,但仍然没有验证属性.

那么有没有办法让我的 senario 工作 - 我不介意重写它,但我真的希望 FluentValidation 为我编写我的 html。

我的后备解决方案是让我自己的 Html 助手生成带有属性的正确 Html,但我认为这很糟糕,因为当对 FluentValidation、jquery 验证或两者之间的mvc链接。

4

1 回答 1

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++; 
}

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

辅导员本

于 2011-04-13T04:02:28.883 回答