MVC Razor:如何在Razor标记中引用辅助参数?

时间:2016-08-29 18:21:56

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

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

e.g。 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表达式转换为&#39; HelperResult&#39;因为它不是委托类型
  3. 我尝试过创建委托,但会导致同样的错误。这可能吗?我的func应该返回一些可以编译/评估为Razor文本的其他类型吗?

2 个答案:

答案 0 :(得分:1)

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

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

errorTemplate期待一个返回HelperResult Template的lambda表达式。

答案 1 :(得分:0)

在浮躁之后,我想出了一些我更喜欢的东西(虽然我确信有更清洁的解决方案)

    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>)