首页 > 解决方案 > 如何从自定义扩展中调用 DisplayFor

问题描述

我正在尝试编写一些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”的定义,并且找不到接受“HtmlHelper”类型的第一个参数的扩展方法“DisplayFor(...)”(您是否缺少 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(...)在我的扩展程序中使用该方法?

标签: asp.netasp.net-mvcrazorasp.net-mvc-5razorengine

解决方案


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

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

推荐阅读