【问题标题】:How I can use a method of a model in a custom HtmlHelper如何在自定义 HtmlHelper 中使用模型的方法
【发布时间】:2011-12-21 08:20:08
【问题描述】:

我正在使用带有 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)));
}

但是当我尝试浏览视图时,我收到一条错误消息,指出无法从 MvcHtmlString 隐式转换为 Func&lt;MvcHtmlString&gt;

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

【问题讨论】:

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


    【解决方案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());
    
    }
    

    【讨论】:

    • 嗯,你是对的 :) 但在这种特殊情况下,我想明确使用 MvcHtmlString 而不是 TValue
    • 我不确定我是否理解。您可以通过 TValue 传递任何类型
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多