MVC嵌套视图和部分视图

XN1*_*N16 2 razor asp.net-mvc-3

我正在使用MVC 3创建一个原型项目,我遇到了一个我似乎无法找到答案的情况,似乎我可能会以错误的方式接近问题.

快速浏览我的项目; 它基于您使用Visual Studio获得的MVC模板,我使用提供的_Layout视图上的链接(选项卡)来访问我的其他一些视图.其中一个链接打开第二个部分视图,该视图再次包含更多视图的链接(特定于管理员.因此拆分).我遇到的问题是我似乎无法@RenderBody在第二个局部视图中显示视图,我理解这是因为你@RenderBody在一个完整的HTML文件中不能有多个,这是有道理的.

所以我的问题是,如何以这种方式显示视图?此外,可能更重要的是,这是实现我正在尝试的这个"子菜单"系统的正确方法,还是有更好的方法来实现这一目标?

以下是视图的相关部分,首先是'main'_Layout文件:

<body>
    <div class="page">
        <header>
            <div id="title">
                <h1>Test App</h1>
            </div>
            <nav>
                <ul id="menu">
                    <li>@Html.ActionLink("Home", "Index", "Home")</li>
                    @if (User.Identity.IsAuthenticated)
                    {
                        <li>@Html.ActionLink("Contracts", "List", "Contract", new { user=User.Identity.Name, page=1 }, null)</li>
                    }
                    @if (User.IsInRole("Administrator"))
                    {
                        <li id="admin">@Html.ActionLink("Administration", "Administration", "Home")</li>
                    }
                </ul>
            </nav>
        </header>
        <section id="main">
            @RenderBody()
        </section>
        <footer>
        </footer>
    </div>
</body>
Run Code Online (Sandbox Code Playgroud)

单击<li id="admin">@Html.ActionLink("Administration", "Administration", "Home")</li>链接时,Home控制器将返回下面显示的第二个局部视图:

<header>
    <div id="admintitle">
        <h1>Administration</h1>
    </div>  
</header>
<body>
    <div id="div-1a">
         <nav>
            <ul id="adminmenu">
                <li>@Html.ActionLink("Contact", "List", "Contact")</li>
                <li>@Html.ActionLink("Home", "Index", "Home")</li>
            </ul>
        </nav>
    </div>
    <div id="div-1c">
        <h1>Test</h1>   
    </div>
    <section id="adminmain">
        @RenderBody()
    </section>
</body>
Run Code Online (Sandbox Code Playgroud)

当我尝试运行代码时,由于第二个代码而失败@RenderBody,这是可以理解的.

如果您需要更多信息,请告诉我.

非常感谢.

Rom*_*zur 6

你不能@RenderBody()多次使用.一个@RenderBody()在主_layout文件是不够公平.在你的第二个观点改用@RenderPartial()@RenderAction.

更新(根据第一条评论)

假设你要渲染/Administrator/TheAction,所以你会打电话

@{
    Html.RenderAction("TheAction", "Administrator");
}
Run Code Online (Sandbox Code Playgroud)

TheAction 动作将如下所示:

public PartialViewResult TheAction() {
    return PartialView();
}
Run Code Online (Sandbox Code Playgroud)

它会将视图呈现在~/Views/Administrator/TheAction.cshtml您调用的地方的正确位置RenderAction().

重要的是它没有完成另一个@RenderBody.正如您在TheAction()示例中看到的那样,您将返回PartialViewResult,它没有任何@RenderBody()帮助程序.