基于ViewModel Dataannotation属性的自定义编辑器模板MVC4
如果[必需]属性修饰我的ViewModel属性,我想要做的是自动将图像跨度添加到我的输入文本框之后,无论它是整数,双精度,字符串,日期等基于ViewModel Dataannotation属性的自定义编辑器模板MVC4
例如,我的视图模型可能看起来像
public class MyViewModel
{
[Required]
public string Name { get; set; }
}
我查看会是什么样子
@Html.EditorFor(model => model.Name)
@Html.ValidationMessageFor(model => model.Name)
,输出会是这样的
<input id="Name" class="text-box single-line" type="text" value="" name="Name" data-val-required="The Name field is required." data-val-length-max="20" data-val-length="The field Name must be a string with a maximum length of 20." data-val="true">
<span class="field-validation-valid" data-valmsg-replace="true" data-valmsg-for="Name"></span>
-- Note the automatically added span
<span class="indicator required" style="width: 11px;"></span>
我打算有一些CSS,将显示图像即
span.required {
background-image: url("required.png");
}
这是可以做到的还是我需要创建自己的Helper方法实现这种类型的功能?
是的,这是可能的,但一般我不会推荐它,因为模板是真的有自定义类型的渲染,你应该能够在不若覆盖另一个令人担忧的模板来创建模板。
我反而会创建一个自定义LabelFor帮手,如这里所描述的:
或在这里:
第三个选择是不会做任何事情MVC,而是添加一些JavaScript,基于标准的MVC验证数据属性添加指标(如果您使用不显眼的验证)。看到这里的答案:
我所做的是修改jquery.validate.unobtrusive JS文件添加第二个容器,专门为你的图片,如果有一个验证错误。
var container2 = $(this).find("[data-valimg-for='" + escapeAttributeValue(inputElement[0].name) + "']"),
replace = $.parseJSON(container.attr("data-valimg-replace")) !== false;
container2.removeClass("img-validation-valid").addClass("img-validation-error");
那就不要忘了将它绑定到模型:
error.data("unobtrusiveContainer", container2);
最后,空它在if(替换)代码块:
if (replace) {
container.empty();
container2.empty();
error.removeClass("input-validation-error").appendTo(container);
}
else {
error.hide();
}
成功时,请记住隐藏它:
var container2 = error.data("unobtrusiveContainer"),
replace = $.parseJSON(container.attr("data-valimg-replace"));
if (container2) {
container2.addClass("img-validation-valid").removeClass("img-validation-error");
error.removeData("unobtrusiveContainer");
if (replace) {
container2.empty();
}
}
如果你看看在文件中的onError和onSuccess函数中,你应该能够找到你可以放入的位置。
在您看来,下面的代码行添加到每个表单输入有验证为:
<img class="img-validation-valid" data-valimg-replace="true" data-valimg-for="<replace with field name here, ie. Name>" src="required.png" />
我只用[Required]
属性测试这一点,但它的工作原理。我也很肯定你可以用它来产生其他的东西,而不仅仅是图像。
干杯朱利安,我会试一试,让你知道我想出了什么 – dreza 2013-03-13 04:36:58
我不会修改jquery.unobtrusive.js,因为这个文件从时间更新到时间,你将不得不重新应用更改。更好的解决方案是只使用jQuery与现有的属性。 – 2013-03-13 06:58:22
是的,如果有办法通过外部脚本文件添加这些更改,就像简单地扩展这两个函数一样,那会更好。 – 2013-03-13 08:13:47
谢谢我会看看 – dreza 2013-03-13 04:36:39