【问题标题】:RenderPartial with model from _Layout.cshtml使用 _Layout.cshtml 中的模型渲染部分
【发布时间】:2016-09-20 05:45:53
【问题描述】:

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 应用程序。它没有“主页”、“关于”、“联系方式”等典型的硬编码菜单选项。大多数菜单都是从用户维护的数据库记录中创建的。菜单是为用户个性化的。没有两个用户会有相同的菜单项。例如:经理为每个员工获取一个菜单项。

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

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

这似乎与#Render partial with a model in Layout View 相似,但我认为这个问题通过提及会话而偏离了轨道。

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

【问题讨论】:

  • 你试过@Html.Partial("pMenu", menu)吗?假设pMenu.cshtml~/Views/Shared/
  • @Yvette 我认为我第一次提出这个问题时非常令人困惑。希望编辑后会更清晰一些。
  • @jrummell 无论哪种方式,编译器错误消息:CS0103:当前上下文中不存在名称“菜单”
  • 那么,您需要声明并实例化该变量。
  • @jrummell 我正在通过 Controller 类的扩展在每个页面加载时实例化菜单。

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


【解决方案1】:

ViewData 来救援。

_Layout.cshtml

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

主控制器

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?

【解决方案2】:

我想你想渲染一个菜单。在我看来,您应该为此目的创建一个辅助方法。如果您想了解这项技术,并且如果您是创建自己标签的新手,那么请按照本基本教程了解一些情况:http://www.codeproject.com/Articles/787320/An-Absolute-Beginners-Tutorial-on-HTML-Helpers-and

【讨论】:

  • EditorFor 和 DisplayFor 模板很棒。我做了一些并在其他情况下使用它们,但我认为它们在这里无关紧要。我已经编辑了问题并添加了部分视图,希望现在更清楚一点。
【解决方案3】:

您始终可以包含一个包含通用内容的基本索引视图,然后在页面中引用您的布局。您在某种程度上继承了视图并发送模型数据。

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

【讨论】:

  • 我不关注。您的代码将放置在哪里以及如何调用它?每个页面都需要菜单以及其他内容。
猜你喜欢
  • 2019-01-31
  • 1970-01-01
  • 1970-01-01
  • 2012-03-03
  • 1970-01-01
  • 1970-01-01
  • 2010-12-06
  • 2013-09-06
  • 2011-05-23
相关资源
最近更新 更多