Asp.net mvc MVC5:Can@Html.TextBoxFor(或EditorFor)从模型';s数据注释?
似乎应该有一种方法来指定模型注释,如:Asp.net mvc MVC5:Can@Html.TextBoxFor(或EditorFor)从模型';s数据注释?,asp.net-mvc,asp.net-mvc-5,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的生成会将输入字段的maxlength设置为2。现在,我需要这样做: @Html.TextBoxFor(model => model.State
[Display(Name="State")]
[MaxLength(2)]
public string State { get; set; }
因此,在EditorFor或TextBoxFor中使用时,例如:
@Html.EditorFor(model => model.State)
或
html的生成会将输入字段的maxlength设置为2。现在,我需要这样做:
@Html.TextBoxFor(model => model.State, new { maxlength = 2 })
由于这违反了DRY原则,我想知道是否已经有一种内置方法可以将此流从数据注释传递到输入字段?有一个答案描述了在视图中获取其他元数据值的方法。记住这一点,你可以这样做
为模型添加注释:
[AdditionalMetadata("MaxLength", 30)]
public string State { get; set; }
定义自定义编辑器模板(String.cshtml):
那么就做:
@Html.EditorFor(m => m.State)
这可能需要一些调整,可以通过定义自定义属性而不是仅仅使用AdditionalMetadata
来改进,但这应该可以让您开始
我也倾向于将对模型附加元数据的调用封装在自定义HTML帮助程序中。这目前不受支持,您可以 我认为通过使用
ModelMetadata
的ContainerType
和PropertyName
属性,您可以获得PropertyInfo
,并从该查询中获得MaxLength
属性,所有这些都在自定义编辑器模板中。使用
[StringLength(2)]
而不是
[MaxLength(2)]
这是我为解决这个问题所做的 创建了一个js文件,用于处理添加所需的字段标记和maxlength属性:
var formUtility=函数(){
返回{
AddMaxLength:函数(){
$(“输入[数据值最大长度]”)。每个(函数(){
$(this.attr(“maxlength”,this.attr(“data val length max”);
});
},
ShowRequiredFields:函数(){
$(“需要输入[数据值]”)。每个(函数(){
$(this.prev().prepend(“*”);
});
}
}
}();代码>不确定我是否喜欢将其作为“功能”的想法,因为StringLength属性和HTML maxlength是不同的关注点,这可能会给升级解决方案带来突破性的变化。。。模板系统为您自己实现这些约束提供了很大的灵活性;我看不出它需要是默认行为。@AntP您应该在问题跟踪程序上进行注释。您是否仍然需要在数据注释中设置两次?一次设置AdditionalMetadata,另一次设置MaxLength或StringLength?当然,这会更方便一些,因为它们都在同一个文件中,我一定会尝试一下。谢谢您的回复。是的,您需要设置两次。要考虑的另一件事是使用自定义<代码> MealMeta Advase<代码>查找<代码>最大长度属性,并显式添加<代码>附加值< /代码>键,如果它存在,这将阻止您每次必须添加两个属性。
[StringLength(2)]
[MaxLength(2)]