我如何在自定义HtmlHelper中使用模型的方法

时间:2011-12-21 08:20:08

标签: asp.net-mvc-3 razor lambda html-helper

我正在使用带有Razor视图引擎的ASP.NET MVC 3进行编程。这就是我能够做到的:

@Html.DisplayWithLabel(model => model.DisplayEventDate(), "When", "")

DisplayWithLabel是一个自定义HTML帮助程序,用于显示带标签的内容。

这是它的签名(或者至少我认为应该是这样的):

public static MvcHtmlString DisplayWithLabel<TModel>(this HtmlHelper<TModel> html, Expression<Func<TModel, Func<MvcHtmlString>>> expression, string label, string cssClass)

为什么我这样使用我的模型?好吧,我想为我的模型提供扩展方法,以帮助我在必要时格式化数据(而不是在模型本身内部格式化数据)。例如,为了格式化事件日期,我有这个扩展方法:

public static MvcHtmlString DisplayEventDate(this MyEntity entity)
{
    return new MvcHtmlString(string.Format("{0}@{1}", string.Format("{0:D}", entity.EventDate),
                             string.Format("{0:t}", entity.EventDate)));
}

但是当我尝试浏览视图时,我收到一条错误消息,指出无法隐式转换为MvcHtmlStringFunc<MvcHtmlString>

我试图弄清楚自己,但我找不到线索所以请帮帮我:)。

1 个答案:

答案 0 :(得分:1)

你应该可以这样做:

public static MvcHtmlString MyMethodName<TModel, TValue>(
    this HtmlHelper<TModel> html,
    Expression<Func<TModel, TValue>> expression,
    string myText) {
    var exprValue = ModelMetadata.FromLambdaExpression(expression, 
                      htmlHelper.ViewData).Model;

    var builder = new TagBuilder("label");
    builder.SetInnerText(myText + " " + exprValue.ToString());
    return MvcHtmlString.Create(builder.ToString());

}