いや~、連休ももうすぐ終わってしまうと思うと、ちょっぴりアンニュイな気持ちになってしまいます。アンニュイってララバイくらい意味がよくわからない。
Razor使ってますか?使ってますよね。お腹すいたらRazorだし、テレビ見ながらRazorですよ!
疲れてるのかな...。
~/Views/Shared/_Partial.cshtml
@{
var message = Model ?? (PageData.Any() ? PageData.First().Value : null);
}
ゴールデン @message
↑こんな部分ビューを用意しました。
~/Views/Home/Index.cshtml
@{Layout = null;}
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8" />
<title>連休</title>
</head>
<body>
<p>@@RenderPage -
@RenderPage("~/Views/Shared/_Partial.cshtml", "ウィーク")</p>
<p>Html.RenderPartial -
@{Html.RenderPartial("~/Views/Shared/_Partial.cshtml", "ウィーク");}</p>
<p>Html.Partial -
@Html.Partial("~/Views/Shared/_Partial.cshtml", "ウィーク")</p>
</body>
</html>
↑そしてそれを利用するビューも用意しました。
ここで問題です!このページ(Index.cshtml)を表示するとどういう表示になるでしょーか?
答え
ビックリした?ねーねー、ビックリした?オレ、すげービックリした。
なんでHtml.RenderPartialだと”ゴールデン ウィーク”と表示されないんでしょうね。ソース追っかけたりしてスゴイ悩んだんですよ。そもそもRazorではストリームに直接出力うするHtml.RenderPartial使えないのか!?とか仕様を疑ったり(RenderPartialの実装がMVC3になってTextWriter渡す実装に変わってるから関係ないのにね)。
うーん、煮詰まった。ふと、順番入れ替えたらどうなるのか試してみたんす。
<p>Html.RenderPartial -
@{Html.RenderPartial("~/Views/Shared/_Partial.cshtml", "ウィーク");}</p>
<p>Html.Partial -
@Html.Partial("~/Views/Shared/_Partial.cshtml", "ウィーク")</p>
<p>@@RenderPage -
@RenderPage("~/Views/Shared/_Partial.cshtml", "ウィーク")</p>
@RenderPageを最後に移動。
おや~?ちゃんと出た。あれ~。この際Html.Partialは無視して試しに親戚のHtml.RenderActionはどうなるのか試してみたっす。
HomeControllerに以下を追加。
[ChildActionOnly]
public ActionResult Week()
{
return Content("ウィーク");
}
Index.cshtmlを以下のように変更(@RenderPageを最初に持って来てHtml.RenderAction追加)。
<p>@@RenderPage -
@RenderPage("~/Views/Shared/_Partial.cshtml", "ウィーク")</p>
<p>Html.RenderPartial -
@{Html.RenderPartial("~/Views/Shared/_Partial.cshtml", "ウィーク");}</p>
<p>Html.RenderAction -
ゴールデン @{Html.RenderAction("Week");}</p>
Html.RenderActionは平気みたい。このまま@RenderPageを最後に移動。
<p>Html.RenderPartial -
@{Html.RenderPartial("~/Views/Shared/_Partial.cshtml", "ウィーク");}</p>
<p>Html.RenderAction -
ゴールデン @{Html.RenderAction("Week");}</p>
<p>@@RenderPage -
@RenderPage("~/Views/Shared/_Partial.cshtml", "ウィーク")</p>
ちゃんと出ますね。ということはですよ、同じWebPage中では@RenderPageした後はHtml.RenderPartialが正しく動かないということですよ。これってもしかして...。あ、いや、仕様かもしれないし。どういう事?教えてWebMatrixMan~!
※@RenderPage自体がRazor構文なのでWeb Formsでは関係ない問題です。