似乎应该有一种方法来指定模型注释,如:
[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原则,我想知道是否已有内置方法将数据注释流向输入字段?
答案 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;
将其链接到我需要的页面后,只需将其称为:
<script>
formUtility.AddMaxLength();
formUtility.ShowRequiredFields();
</script>
&#13;
答案 2 :(得分:1)
目前不支持此功能,您可以vote for this feature。
我认为通过使用ContainerType
的{{1}}和PropertyName
属性,您可以获取ModelMetadata
,并从PropertyInfo
属性的查询中获取所有这些在自定义编辑器模板中。
答案 3 :(得分:0)
使用
[StringLength(2)]
而不是
[MaxLength(2)]