Asp.net mvc MVC Razor RenderPage阻止在下游使用Html.RenderPartial

Asp.net mvc MVC Razor RenderPage阻止在下游使用Html.RenderPartial,asp.net-mvc,Asp.net Mvc,在试图让我的大脑围绕RenderPageV。Html.Partial v。我一直在玩一些测试文件。我遇到了一些奇怪的行为:一旦调用了RenderPage(),似乎所有对Html.RenderPartial()的后续调用都变成了no-ops。为什么一个阻止另一个 Foo.cshtml: <div>foo</div> foo Bar.cshtml: <div>bar</div> 条 Test1.cshtml: @{ Layout = n

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

Foo.cshtml:

<div>foo</div>
foo
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>
@{
布局=空;
}
试验
@{Html.RenderPartial(“Foo”);}
@渲染页面(“Bar.cshtml”)
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>
//Test2.cshtml与Test1.cshtml相同,除了下面的两行
// ...
@RenderPage(“Bar.cshtml”)//这行过去是第二行
@{Html.RenderPartial(“Foo”);}//这一行以前是第一行
Test1的行为与您期望的完全一样:
foo
bar

但是,Test2从不呈现“foo”;好像我对{Html.RenderPartial(“Foo”);}的调用从未发生过

我意识到这个例子是人为的——我不是在寻找解决问题的方法。我试图了解RenderPage和Html.RenderPartial之间的关系,以及它们相互干扰的原因。

您可以查看

正如Annabelle提到的:

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

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

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

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

Html.RenderPartial("MyView")
RenderPage("MyView.cshtml")