asp.net-mvc-3 - MVC 嵌套 View 和部分 View

标签 asp.net-mvc-3 razor

我正在使用 MVC 3 创建一个原型(prototype)项目,我遇到了一种我似乎无法找到答案的情况,而且我似乎可能以错误的方式解决了这个问题。

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

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

这里是 View 的相关部分,首先是“主”_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>

当点击 <li id="admin">@Html.ActionLink("Administration", "Administration", "Home")</li>链接,然后 Home Controller 返回如下所示的第二个局部 View :

<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>

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

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

非常感谢。

最佳答案

您不能多次使用@RenderBody()。主 _Layout 文件中的一个 @RenderBody() 就足够了。在您的第二个 View 中,改用 @RenderPartial()@RenderAction

更新(基于第一条评论)

假设你想渲染/Administrator/TheAction,所以你会调用

@{
    Html.RenderAction("TheAction", "Administrator");
}

TheAction 操作将如下所示:

public PartialViewResult TheAction() {
    return PartialView();
}

它会在 ~/Views/Administrator/TheAction.cshtml 中渲染 View ,就在您调用 RenderAction() 的地方。

重要的是它不会完成另一个@RenderBody。正如您在 TheAction() 示例中所见,您返回的是 PartialViewResult,它没有任何 @RenderBody() 助手。

关于asp.net-mvc-3 - MVC 嵌套 View 和部分 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11897791/

相关文章:

c# - 在 1 个网站上使用和注册多个 ASP.NET mvc3 解决方案

javascript - MVC Razor 从 javascript View 中的 Controller 获取值

asp.net-mvc-4 - Mvc4 模型到 url 查询字符串

asp.net-mvc - ASP.NET MVC - 无法将数组绑定(bind)到 View 模型

asp.net-mvc - View 如何知道使用哪种布局?默认在哪里?

asp.net-mvc - 允许匿名调用 asp.net mvc 3 中的某些操作

asp.net-mvc-3 - MVC Razor GUI 和 Coder 协同工作

asp.net-mvc-3 - 具有级联部分的 Razor 嵌套布局

asp.net-mvc-3 - ASP.NET MVC View 模型未绑定(bind)到带有 DropDownList 的 HTTP Post

nHibernate + Mvc3 示例应用程序