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

How can I call DisplayFor from inside of a custom extension

我正在尝试编写一些 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' does not contain a definition for 'DisplayFor' and no extension method 'DisplayFor(...)' accepting a first argument of type 'HtmlHelper' could be found (are you missing a using directive or an assembly reference?

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

我添加了对以下库的引用

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

但还是报错

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

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

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

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