我不明白IViewComponentHelper.RenderInvoke的目的,因为它返回void。
Invoke方法将在我的视图中呈现一个html字符串,这就是我总是使用它来呈现MVC6 ViewComponent。
答案 0 :(得分:3)
Invoke
和RenderInvoke
之间的差异是它们的返回值以及它们的结果如何到达最终输出。
使用@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}}
希望这有帮助!