试图让我的大脑围绕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是如何相关的,以及它们为什么互相干扰。
答案 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模板查找并接收精确的模板路径作为其参数