RenderPartial与_Layout.cshtml中的模型

时间:2016-09-20 05:45:54

标签: c# asp.net-mvc asp.net-mvc-5

Html.RenderPartial的一个重载允许您传入模型。你如何利用_Layout.cshtml中的那个?

我准备了一个模型,准备了我需要的一切。我只是看不到如何使布局可以访问它。

_Layout.cshtml

<!DOCTYPE html>
<html>
<head>
    ...
</head>
<body>
    <nav>
    @{ Html.RenderPartial("pMenu", menu); }
    </nav>
    ...

pMenu.cshtml

菜单的局部视图。希望这清楚地说明菜单是动态的,确实需要传递给它的模型。

@model MyApplication.Menu

@foreach (KeyValuePair<string, MyApplication.MenuGroup> group in Model.group)
{
    if (group.Key != "default")
    {
        <div>@group.Key.ToString()</div>
    }
    <ul>
        @foreach (MyApplication.MenuItem item in group.Value.items.Values)
        {
            <li>
                @if (item.isCurrent)
                {
                    <span class="@item.Icon">@item.LinkText</span>
                }
                else
                {
                    @Html.ActionLink(item.LinkText, item.Action, item.Controller, item.RouteValues, new { @class = @item.Icon })

                }
                @if (null != item.subItems)
                {
                    <ul class="tree">
                        @foreach (MyApplication.SubItem subitem in item.subItems)
                        {
                            <li>
                                @if (subitem.isCurrent)
                                {
                                    <span>@subitem.LinkText</span>
                                }
                                else
                                {
                                    @Html.ActionLink(subitem.LinkText, subitem.Action, subitem.Controller, subitem.RouteValues, null)
                                }
                            </li>
                        }
                    </ul>
                }
            </li>
        }
    </ul>
}

菜单在哪里实例化?

public class MainController : Controller
{
    protected override void Initialize(System.Web.Routing.RequestContext requestContext)
    {
        base.Initialize(requestContext);
        menu = new Menu(requestContext.RouteData.Values);

背景资料

这是一个Intranet应用程序。它没有“Home”,“About”,“Contact”的典型硬编码菜单选项。大多数菜单都是由用户维护的数据库记录创建的。菜单针对用户个性化。没有两个用户将拥有相同的菜单项。例如:经理为每个员工获取一个菜单项。

菜单模型还处理使菜单“动态”的其他因素,例如:

  • 识别所请求的页面是否与给定的菜单项匹配(通过路线数据)(用于样式化)
  • 根据角色添加额外的菜单项
  • 有时会为当前上下文添加子菜单

这似乎与#Render partial with a model in Layout View相似,但我认为这个问题在提及会话时已经失去了作用。

免责声明:我是一名经验丰富的程序员,但对C#和asp.NET MVC来说相对较新。

3 个答案:

答案 0 :(得分:1)

ViewData救援。

_Layout.cshtml

@{ Html.RenderPartial("pMenu", ViewData["menu"]); }

MainController

menu = new Menu(requestContext.RouteData.Values);
ViewData["menu"] = menu;

在此之后修改menu仍然有效。我不知道为什么,但我会接受它。

另见Best way to do global viewdata in an area of my ASP.NET MVC site?

答案 1 :(得分:0)

我想你要渲染一个菜单。从我的角度来看,你应该为此创建一个帮助方法。如果你想要通过这种技术,如果你是新手来创建自己的标签,那么请按照这个基础教程来获得一些未知的:http://www.codeproject.com/Articles/787320/An-Absolute-Beginners-Tutorial-on-HTML-Helpers-and

答案 2 :(得分:0)

您总是可以包含一个包含通用内容的基本索引视图,然后在页面中引用您的布局。你有点继承视图并发送模型数据。

@model Model.MyIndexModel
@{Layout = "~/Views/Shared/Layouts/_SinglePageLayout.cshtml";}