如何从自定义扩展程序内部调用DisplayFor

时间:2018-08-10 04:50:05

标签: asp.net asp.net-mvc razor asp.net-mvc-5 razorengine

我正在尝试编写一些HtmlHelper扩展名以清理我的视图。我需要使用Html.DisplayFor()来渲染我的模型。我写了以下扩展名

public static MvcHtmlString MakeTableBodyTd(this HtmlHelper html, ModelMetadata metaData)
{
    var td = new TagBuilder("td");

    if (metaData != null)
    {
        var cssClassName = metaData.AdditionalValues.GetValueOrDefault("TextAlignment", "left");

        td.AddCssClass(cssClassName);

        var t = html.DisplayFor(x => metaData.Model, metaData.DataTypeName, new { Metadata = metaData }).ToHtmlString();

        td.InnerHtml = t;
    }

    return new MvcHtmlString(td.ToString());
}

但是,此扩展程序给了我这个错误

  

“ HtmlHelper”不包含“ DisplayFor”的定义,并且没有   扩展方法'DisplayFor(...)'接受类型的第一个参数   可以找到“ HtmlHelper”(您是否缺少using指令或   组装参考?

我可以在视图中毫无问题地使用@Html.DisplayFor(...),但无法在扩展类中使用。

我添加了对以下库的引用

using System.Web.Mvc;
using System.Web.Mvc.Html;

但是仍然给我错误。

html仅具有以下可用的方法html.Display()html.DisplayForModel()html.DisplayName()html.DisplayNameForModel()html.DisplayText()

如何在扩展程序中使用html.DisplayFor(...)方法?

1 个答案:

答案 0 :(得分:3)

您需要将方法的签名更改为包括<TModel>才能使用***For()方法。

public static MvcHtmlString MakeTableBodyTd<TModel>(this HtmlHelper<TModel> html, ModelMetadata metaData)
{
    ....
}