2011-10-20 2 views
3

RenderPage v。Html.Partial v。Html.RenderPartialの周りで私の頭脳を手に入れようとする中で、私はいくつかのテストファイルで遊んできました。私はいくつかの奇妙な動作に遭遇しました:一度RenderPage()が呼び出されると、それ以降のHtml.RenderPartial()へのすべての呼び出しがno-opsになるようです。なぜ他人を妨害するのでしょうか?MVC Razor RenderPageは、Html.RenderPartialのダウンストリーム使用を防ぎます。

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がどのように関連しているのか、なぜ彼らが互いに干渉しているのかを理解しようとしています。

答えて

2

アナベルで述べたように、あなたが

アウトthisを確認することができます。

Html.Partial("MyView") 

はMvcHtmlStringに "MYVIEW" ビューをレンダリングします。ビューのルックアップ(つまり、現在のディレクトリを確認してからSharedディレクトリを確認)の標準的なルールに従います。

Html.RenderPartial("MyView") 

出力ストリームを直接レスポンスストリームに書き出す点を除いて、Html.Partial()と同じですか。これは、ビューの内容がメモリ内にバッファされないため、より効率的です。ただし、このメソッドは出力を返さないため、@ Html.RenderPartial( "MyView")は機能しません。 @ {Html.RenderPartial( "MyView");}代わりにコードブロックに呼び出しをラップする必要があります。

RenderPage("MyView.cshtml") 

)(Html.RenderPartialように、直接応答ストリームに(パスとファイル名ではなく、ビュー名によって識別される)指定されたビューをレンダリングします。しかし、 "MyView.cshtml"のモデルとして常に現在のビューのモデルを使用しているようです。

ともhereを見て、あなたはそれを見つけることができます。WebPageBaseの @RenderPage方法は、MVCテンプレートのルックアップを使用していないと、そのパラメータとして、正確なテンプレートパスを受け

関連する問題