我想将模板参数传递给我的帮助器方法以呈现错误。我已经看到了几个完成此操作的示例,但似乎要求在调用帮助程序时模板中的变量在范围内。
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>)
但是我得到以下编译器错误:
我尝试过创建委托,但会导致同样的错误。这可能吗?我的func应该返回一些可以编译/评估为Razor文本的其他类型吗?
答案 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>)