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来说相对较新。
答案 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";}