2

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

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

所以我的问题是,我怎样才能以这种方式显示视图?另外,可能更重要的是,这是实现我正在尝试的“子菜单”系统的正确方法,还是有更好的方法来实现这一目标?

这是视图的相关部分,首先是'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>

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

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

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

非常感谢。

4

4 回答 4

6

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

更新(基于第一条评论)

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

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

TheAction动作将如下所示:

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

它会在~/Views/Administrator/TheAction.cshtml您调用RenderAction().

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

于 2012-08-10T08:19:38.717 回答
3

转变

<section id="adminmain">
   @RenderBody()
</section>

   <div id="adminmain"></div>

@Html.ActionLink("Contact", "List", "Contact")

@Ajax.ActionLink("Contact", "List", "Contact", new AjaxOptions { UpdateTargetId = "adminmain" })

并且在ContactController List行动中返回PartialView()而不是'View()'。

不要忘记jquery.unobtrusive-ajax在您的视图中包含Ajax工作。

在所有阅读罗马的答案之前

于 2012-08-10T09:07:28.327 回答
0

我找到了一个将@Roman Mazur 和@Mohayemin 的答案与AJAX 调用结合在一起的解决方案。

按照 Roman 的建议,我将 View 更改为以下内容:

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

然后我按照 Mohayemin 的建议将该部分更改为 div:

<div id="adminmain"></div> 

然后,我创建了一个链接,该链接在其单击事件上调用 AJAX 脚本:

<li><a id="load-partial">CONTACTS</a></li>

<script>
$(document).ready(function () {
    $('#load-partial').click(function () {
        $.ajax({
            url: '/Contact/List/',
            datatype: 'html',
            success: function (data) {
                $('#adminmain').empty().html(data);
            }
        });
    });
});
</script>

它运作良好,但我总是乐于接受有关如何改进它的更多建议。

非常感谢。

于 2012-08-10T19:29:16.160 回答
0

在 MVC4 中使用嵌套的局部视图时,我遇到了一些有趣的事情。以防万一有人偶然发现这个..

在循环中渲染局部视图时,

@Html.Partial()

不起作用。

相反,使用@Html.RenderPartial(); 它发出 HTML 而不是在前一种情况下编码的 HTML 并且可以工作。

干杯!

于 2014-05-10T16:18:59.527 回答