MVC5 HTMLHelper扩展不返回预期的内容

时间:2014-03-05 22:27:10

标签: asp.net-mvc html-helper

我希望扩充“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="">

所有漂亮的数据注释标签都发生了什么?

1 个答案:

答案 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);
}