自定义编辑器模板基于ViewModel Dataannotation属性MVC4

时间:2013-03-13 02:50:20

标签: view asp.net-mvc-4 viewmodel data-annotations editorfor

如果[必需]属性修饰了我的ViewModel属性,我想要做的是在输入文本框之后自动添加图像范围,无论是整数,双精度,字符串,日期等等

例如,我的ViewModel可能看起来像

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方法来实现这种类型的功能?

2 个答案:

答案 0 :(得分:2)

是的,这是可能的,但总的来说我不推荐它,因为模板真的可以自定义类型渲染,你应该能够创建模板而不必担心它是否会覆盖另一个模板。

我会改为创建一个自定义的LabelFor助手,例如这里描述的那个:

http://weblogs.asp.net/imranbaloch/archive/2010/07/03/asp-net-mvc-labelfor-helper-with-htmlattributes.aspx

或在这里:

http://weblogs.asp.net/raduenuca/archive/2011/02/17/asp-net-mvc-display-visual-hints-for-the-required-fields-in-your-model.aspx

第三种选择是不在MVC中做任何事情,而是添加一些javascript,它将根据标准的MVC验证数据属性添加指标(如果你使用的是不引人注意的验证)。请参阅答案:

https://stackoverflow.com/a/8524547/61164

答案 1 :(得分:1)

我所做的是修改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]属性对其进行了测试,但它确实有效。我也很确定你也可以使用它来生成其他东西,而不仅仅是图像。