【问题标题】:MVC Razor: How to reference helper parameter in Razor markup?MVC Razor:如何在 Razor 标记中引用辅助参数?
【发布时间】:2016-08-29 18:21:55
【问题描述】:

我想将模板参数传递给我的辅助方法以呈现错误。我已经看到了几个这样做的示例,但似乎要求在调用帮助程序时模板中的变量在范围内。

例如Expression of HelperResult to format item from a list

我希望做类似的事情:

    public static MvcHtmlString ErrorBlock<TModel>(this HtmlHelper helper, TModel model, string @class = null, object context = null, string view = null, object attributes = null, Func<ErrorModel,HelperResult> errorTemplate = null)
        where TModel : ErrorModel

...

@ShopMR.ErrorBlock(Model, errorTemplate: r => @<div>@r.Message</div>)

但我得到以下编译器错误:

  1. 无法将 lambda 表达式转换为预期的委托类型,因为 块中的某些返回类型不可隐式转换 到委托返回类型
  2. 无法将 lambda 表达式转换为类型“HelperResult”,因为它不是委托类型

我尝试创建一个委托,但它导致了同样的错误。这可能吗?我的 func 是否应该返回一些可以编译/评估为 Razor 文本的其他类型?

【问题讨论】:

    标签: c# asp.net-mvc asp.net-mvc-4 razor


    【解决方案1】:

    要摆脱编译错误,请将 rasor 更改为:

    @ShopMR.ErrorBlock(Model, errorTemplate:r => new HelperResult( x => { x.WriteLine($"<div>r.Message</div>" ); } )
    

    errorTemplate 需要一个返回 HelperResult 模板的 lambda 表达式。

    【讨论】:

    • 这解决了这个问题,尽管我希望有一个更酷的解决方案仍然可以让我利用编译时检查。非常感谢!
    【解决方案2】:

    在胡思乱想之后,我想出了一些我更喜欢的东西(尽管我确信有更清洁的解决方案)

        public static MvcHtmlString ErrorBlock<TModel>(this HtmlHelper helper, TModel model, 
            string @class = null, object context = null, string view = null, object attributes = null, 
            Func<ErrorModel, Func<ErrorModel,IHtmlString>> errorTemplate = null)
            where TModel : BaseModel
        {
        ...
            if (errorTemplate != null)
            {
                var formattedErrors = errors.Select(e => errorTemplate?.Invoke(e)?.Invoke(e)?.ToHtmlString() ?? string.Empty);
                tb.InnerHtml = string.Join("", formattedErrors);
            }
        }
        ....
    

    这允许我在调用扩展时使用我想要的语法:

    @ShopMR.ErrorBlock(Model, errorTemplate: r => @<div>@r.Message</div>)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-10
      • 2012-06-30
      • 2016-07-15
      • 1970-01-01
      • 2012-05-29
      相关资源
      最近更新 更多