MVC Razor RenderPage阻止下游使用Html.RenderPartial

时间:2011-10-20 17:35:16

标签: asp.net-mvc

试图让我的大脑围绕RenderPage v.Html.Partial v.Html.RenderPartial,我一直在玩一些测试文件。我遇到了一些奇怪的行为:一旦调用RenderPage(),似乎对Html.RenderPartial()的所有后续调用都变为no-ops。为什么一个人阻止另一个?

Foo.cshtml:

<div>foo</div>

Bar.cshtml:

<div>bar</div>

Test1.cshtml:

@{
    Layout = null;
}
<!DOCTYPE html>
<html>
<head>
    <title>Test</title>
</head>
<body>
  @{ Html.RenderPartial("Foo"); }
  @RenderPage("Bar.cshtml")
</body>
</html>

Test2.cshtml:

// Test2.cshtml is identical to Test1.cshtml, except the two lines below
// ...
<body>
  @RenderPage("Bar.cshtml")        // this line used to be second
  @{ Html.RenderPartial("Foo"); }  // this line used to be first
</body>

Test1的行为完全符合您的预期:
foo
bar

然而,Test2永远不会呈现“foo”;好像我打电话给@ {Html.RenderPartial(“Foo”);永远不会发生。

我意识到这个例子是人为的 - 我不是在寻找解决问题的方法。我试图理解RenderPage和Html.RenderPartial是如何相关的,以及它们为什么互相干扰。

1 个答案:

答案 0 :(得分:2)

您可以查看this

如安娜贝尔所说:

Html.Partial("MyView")

将“MyView”视图渲染为MvcHtmlString。它遵循视图查找的标准规则(即检查当前目录,然后检查共享目录)。

Html.RenderPartial("MyView")

与Html.Partial()相同,只是它将其输出直接写入响应流。这样更有效,因为视图内容不会缓存在内存中。但是,因为该方法不返回任何输出,@ Html.RenderPartial(“MyView”)将无法正常工作。你必须在代码块中包装调用:@ {Html.RenderPartial(“MyView”);}。

RenderPage("MyView.cshtml")

将指定的视图(由路径和文件名而不是视图名称标识)直接呈现到响应流,如Html.RenderPartial()。但是,似乎总是使用当前视图的模型作为“MyView.cshtml”的模型。

并且通过查看here您可以发现: WebPageBase的@RenderPage方法不使用MVC模板查找并接收精确的模板路径作为其参数