RenderActionを使用してビューを呼び出すマスターページ(site.master)があります。現時点では、ビューは「helloworld」を返します。
site.master:
<%@ Master Language="C#" Inherits="System.Web.Mvc.ViewMasterPage" %>
<html>
<head id="Head1" runat="server">
<title><asp:ContentPlaceHolder ID="ContentPlaceHolder1" runat="server" /></title>
<asp:ContentPlaceHolder ID="ContentPlaceHolder2" runat="server" />
</head>
<body>
<% Html.RenderAction("Test", "Charts"); %>
<asp:ContentPlaceHolder ID="ContentPlaceHolder3" runat="server" >
<p>site.master</p>
</asp:ContentPlaceHolder>
<asp:ContentPlaceHolder ID="ContentPlaceHolder4" runat="server" />
</body>
</html>
Test.aspx:
<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage<dynamic>" %>
hello world!
ChartsController.cs:
public ActionResult Test()
{
return View();
}
マスターページの名前を明示的に渡すようにビューを更新すると、RenderActionを呼び出すときにエラーが発生します。
ChartsController.cs:
public ActionResult Test()
{
return View(null, "site");
}
エラー:
コンテンツコントロールは、コンテンツページまたはマスターページを参照するネストされたマスターページのトップレベルのコントロールである必要があります。
Stack Trace:
[HttpException (0x80004005): Content controls have to be top-level controls in a content page or a nested master page that references a master page.]
System.Web.UI.MasterPage.CreateMaster(TemplateControl owner, HttpContext context, VirtualPath masterPageFile, IDictionary contentTemplateCollection) +8857854
System.Web.UI.Page.get_Master() +54
System.Web.UI.Page.ApplyMasterPage() +15
System.Web.UI.Page.PerformPreInit() +45
System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +328
ビューで使用するマスターページを設定するにはどうすればよいですか?最終的には、カスタムViewEngineを使用して(VirtualPathProviderViewEngine.FindViewをオーバーライドすることにより)マスターページを動的に設定します。
if ( String.IsNullOrEmpty(masterName) ){ masterName = "site"; }
ViewEngineでmasterNameプロパティを設定してから、site.masterからRenderActionを呼び出すと、ActionでmasterNameプロパティを設定した場合と同じエラーが発生します。
使用しているもの:
Visual Studio 2010
MVC 3
IIS Express
編集:完全なsite.masterマークアップを追加