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链接.
在您的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
| 归档时间: |
|
| 查看次数: |
3413 次 |
| 最近记录: |