MVC5:@ Html.TextBoxFor(或EditorFor)可以从Model的Data Annotation中获取MaxLength吗?

时间:2014-03-08 15:51:47

标签: asp.net-mvc asp.net-mvc-5

似乎应该有一种方法来指定模型注释,如:

[Display(Name="State")]
[MaxLength(2)]
public string State { get; set; }

这样当它在EditorFor或TextBoxFor中使用时,如:

@Html.EditorFor(model => model.State)

@Html.EditorFor(model => model.State)

生成html会将输入字段的maxlength设置为2.现在,我需要这样做:

@Html.TextBoxFor(model => model.State, new { maxlength = 2 })

由于这违反了DRY原则,我想知道是否已有内置方法将数据注释流向输入字段?

4 个答案:

答案 0 :(得分:3)

答案here描述了在视图中获取其他元数据值的方法。考虑到这一点,你可以做这样的事情......

为您的模型添加注释:

[AdditionalMetadata("MaxLength", 30)]
public string State { get; set; }

定义自定义编辑器模板(String.cshtml):

@{
    string maxLength = ViewData.ModelMetadata.AdditionalValues.ContainsKey("MaxLength")
        ? ViewData.ModelMetadata.AdditionalValues["MaxLength"].ToString() : null;
}

@Html.TextBox("", Model, new { maxlength = maxLength })

然后就这样做:

@Html.EditorFor(m => m.State)

这可能需要进行一些调整,可以通过定义自定义属性而不是仅使用AdditionalMetadata来改进,但它应该让您开始。

我倾向于在自定义HTML帮助程序中结束对模型的附加元数据的调用。

答案 1 :(得分:2)

以下是我为解决这个问题所采取的措施。

创建一个js文件来处理添加必需的字段标记和maxlength属性:



var formUtility = function () {
    return {
        AddMaxLength: function () {
            $("input[data-val-length-max]").each(function () {
                $(this).attr("maxlength", $(this).attr("data-val-length-max"));
            });
        },
        ShowRequiredFields: function () {
            $("input[data-val-required]").each(function () {
                $(this).prev().prepend("<span>* </span>");
            });
        }
    }
}();
&#13;
&#13;
&#13;

将其链接到我需要的页面后,只需将其称为:

&#13;
&#13;
    <script>
        formUtility.AddMaxLength();
        formUtility.ShowRequiredFields();
    </script>
&#13;
&#13;
&#13;

答案 2 :(得分:1)

目前不支持此功能,您可以vote for this feature

我认为通过使用ContainerType的{​​{1}}和PropertyName属性,您可以获取ModelMetadata,并从PropertyInfo属性的查询中获取所有这些在自定义编辑器模板中。

答案 3 :(得分:0)

使用

[StringLength(2)]

而不是

[MaxLength(2)]