MVC6 ViewComponents RenderInvoke() 与 Invoke()

MVC6 ViewComponents RenderInvoke() vs Invoke()

我不明白 IViewComponentHelper.RenderInvoke 的目的,因为它 returns 无效。

Invoke 方法将在我的视图中呈现一个 html 字符串,这是我一直用来呈现 MVC6 ViewComponent 的内容。

InvokeRenderInvoke 之间的区别在于它们的 return 值以及它们的结果如何到达最终输出。

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

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

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

现在 RenderInvoke。由于其 return 值 (void),Component.RenderInvoke(...) 无法在 Razor 页面中在其前面写入 @。这个方法的目的是:我不要任何中间值(HtmlString)直接写到结果流(ViewContext.Writer)。因此,您将始终以类似于此的格式使用 RenderInvoke

@{
    Component.RenderInvoke(...);
}

总结一下。 Invoke 用于在您想编写 @Component.Invoke(...) 时方便使用,或者用于通过将值保存到变量来检查值。 RenderInvoke 做的工作最少,不创建 HtmlString 并直接写入最终输出;当您想在 @functions {...} 块中渲染 ViewComponents 时也很方便:

@functions
{
    public void SomeUtility()
    {
        ...
        Component.RenderInvoke(...);
        ...
    }
}

希望这对您有所帮助!