如何将 MVC 子 Action PartialView 渲染到 Layout @RenderSection() 中?

Posted

技术标签:

【中文标题】如何将 MVC 子 Action PartialView 渲染到 Layout @RenderSection() 中?【英文标题】:How to render MVC child Action PartialView into Layout @RenderSection()? 【发布时间】:2013-12-06 16:47:36 【问题描述】:

在布局中,MVC子动作被调用。但是,partialView 结果未显示在 RenderSection("userProfile", required:false) 中。不过,Watch 窗口显示结果包含数据。谢谢。

控制器的动作

    [ChildActionOnly]
    public ActionResult GetUserProfile()
    
        var vm = base.appVM.User;
        return PartialView("UserProfilePartial", vm);
    

UserProfilePartial.cshtml

@model myApp.viewModel

@section userProfile

    <div>@string.Format("0, 1", Model.lastName, Model.firstName)</div>

    @foreach (var item in Model.Locations)
     
        <div>
            <ul class="row">
                <li class="cell">@item.LocType</li>
                <li class="cell">@item.LocName</li>
                <li class="cell">@item.UserRole</li>
            </ul>
        </div>
    

Layout.cshtml

   <body>
      <header>
        <div class="content-wrapper">
            <div class="float-left">
                <p class="site-title">@Html.ActionLink("Home", "Index", "Home")</p>
            </div>

            @Html.Action("GetUserProfile","User")
            <div class="float-right">

                @RenderSection("userProfile", required: false)

            </div>                       

            @Html.Action("Index", "Menu"); 
            <div class="menu">

                @RenderSection("menu", required:false)

            </div>
        </div>
    </header>

    @RenderBody()

  </body>

【问题讨论】:

【参考方案1】:

您不能在局部视图中使用部分。只有视图支持使用部分。部分视图仅用于显示内容,而不是指定功能可以执行的其他功能。有类似的线程,请查看here。

【讨论】:

【参考方案2】:

好吧,我就是这样做的

在主 _ViewStart.cshtml 我把这段代码

@
    if (Request["Partial"] == null)
    
        //return full view
        Layout = "~/Views/Shared/_Layout.cshtml";
    
    else
    
        //this will give just a partialview with the bodyContent
        Layout = "~/Views/Shared/_LayoutPartial.cshtml";
    

然后我可以返回完整视图,它将根据部分请求返回视图 (href=http://www.d.com/account/login?=partial=partial)

它只是工作!

顺便说一下,您可以在部分布局部分和其他部分中添加 因为毕竟它只是一个常规布局

【讨论】:

【参考方案3】:

主要问题是您正在渲染没有布局的局部视图。当您渲染局部视图时,它只会渲染您指定的代码,但是您创建了一个除了 Layout.cshtml 之外不会在任何地方渲染的部分,但是不会在任何地方调用布局。要解决此问题,您必须将布局代码添加到局部视图。

@model myApp.viewModel

@
    Layout = "~/Views/Shared/Layout.cshtml";  // <---- adding the layout 


@section userProfile

    <div>@string.Format("0, 1", Model.lastName, Model.firstName)</div>

    @foreach (var item in Model.Locations)
     
        <div>
            <ul class="row">
                <li class="cell">@item.LocType</li>
                <li class="cell">@item.LocName</li>
                <li class="cell">@item.UserRole</li>
            </ul>
        </div>
    

考虑到这一点后,我认为您应该使用 @Html.Partial(""); 不是渲染部分。 看看这个链接,例如http://mvc4beginner.com/Tutorial/MVC-Partial-Views.html

【讨论】:

通过包含 @Layout="~/Views/Shared/_Layout.cshtml"; 来创建堆栈溢出。我知道@Html.Partial() 会将片段插入到调用操作的行,但我希望它呈现在布局中@RenderSection("userProfile") 所在的行。 ...我想在部分视图中使用@section userProfile。

以上是关于如何将 MVC 子 Action PartialView 渲染到 Layout @RenderSection() 中?的主要内容,如果未能解决你的问题,请参考以下文章

就 MVC 模式而言,Struts 2 中使用的 Action 是啥?

asp.net mvc 如何将controller 里一个action 返回值为list<>的值输出到view

如何在 asp.net MVC 中使用 RedirectToAction 将模型从一个 Action 方法传递到另一个?尽管我发送了一个填充模型,但我得到的是空模型

如何使用 Jquery AJAX 调用 MVC Action 然后在 MVC 中提交表单?

请问在.net mvc3.0中,如何在action之间传递参数,切记不能在地址栏中看到

MVC - 将整个模型作为参数传递给 JavaScript 中的 Url.Action