MVC6 ViewComponents RenderInvoke()vs Invoke()

时间:2015-08-18 10:59:21

标签: razor asp.net-core asp.net-core-mvc

我不明白IViewComponentHelper.RenderInvoke的目的,因为它返回void。

Invoke方法将在我的视图中呈现一个html字符串,这就是我总是使用它来呈现MVC6 ViewComponent。

1 个答案:

答案 0 :(得分:3)

InvokeRenderInvoke之间的差异是它们的返回值以及它们的结果如何到达最终输出。

使用@Component.Invoke(...),您可以执行视图组件并将值呈现给页面。或者您可以这样做:

@{
    HtmlString myHtmlString = Component.Invoke(...);
}

这很有用,因为您可以在将Invoke调用写入结果流之前检查其输出。在@Component.Invoke(...)的情况下,输出被转换为HtmlString,然后让页面将其写入结果流。

现在为RenderInvoke。由于其返回值(Component.RenderInvoke(...)),因此无法在Razor页面中使用@前面的void编写HtmlString。此方法的目的是:我不希望任何中间值(ViewContext.Writer)直接将其写入结果流(RenderInvoke)。因此,您将始终以与此类似的格式使用@{ Component.RenderInvoke(...); }

Invoke

总结一切。当您想要编写@Component.Invoke(...)或用于通过将值保存到变量来检查值时,RenderInvoke用于方便。 HtmlString执行的工作量最少,不创建ViewComponents并直接写入最终输出;如果要在@functions {...}块中呈现@functions { public void SomeUtility() { ... Component.RenderInvoke(...); ... } } ,这也很方便:

{{1}}

希望这有帮助!