我希望扩充“Html.TextBoxFor”扩展程序以满足特定客户的需求。
作为一个完整性检查,我开始简单,只是创建了一个Test扩展方法,它只是委托给现有的功能:
public static class HtmlExtensions
{
public static MvcHtmlString Test<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression)
{
return htmlHelper.TextBoxFor(expression);
}
}
一切似乎都有效,直到我针对标有注释的模型进行了尝试,即:
public class TestRoot
{
[Display(Name = "Max Length 10")]
[Required]
[StringLength(10)]
public string MaxLength10 { get; set; }
}
当我调用内置的TextBoxFor函数时,我得到所有预期的标记,即:
@ Html.TextBoxFor(e =&gt; e.MaxLength10)
<input data-val="true" data-val-length="The field Max Length 10 must be a string with a maximum length of 10." data-val-length-max="10" data-val-required="The Max Length 10 field is required." id="MaxLength10" name="MaxLength10" type="text" value="">
当我打电话给我的分机时,我期待相同的内容,但我得到了这个:
@ Html.Test(E =&GT; e.MaxLength10)
<input id="MaxLength10" name="MaxLength10" type="text" value="">
所有漂亮的数据注释标签都发生了什么?
答案 0 :(得分:1)
我有一个类似的扩展方法,可以创建一个正常工作的水印文本框。试一试,看看它是否解决了您的问题。另外,请查看ModelMetadata实例,看看它是否正确创建。
public static MvcHtmlString WatermarkTextBoxFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, object htmlAttributes = null)
{
ModelMetadata metadata = ModelMetadata.FromLambdaExpression<TModel, TProperty>(expression, htmlHelper.ViewData);
string watermark = !String.IsNullOrEmpty(metadata.Watermark) ? metadata.Watermark : metadata.DisplayName;
var attributes = htmlHelper.MergeAttributes(htmlAttributes, new { placeholder = watermark });
return htmlHelper.TextBoxFor<TModel, TProperty>(expression, attributes);
}