我在该布局中有一个布局页面我使用了局部视图,局部视图包含我已经构建的菜单功能,我将菜单拆分为局部视图以确保它易于维护。菜单特意放置在布局中,因为它用于每个页面,但菜单中有条件元素,某些选项只出现在某些页面上。
我偶然发现了将来会出现什么问题,菜单使用ajax调用来呈现包含内容的部分视图(减少页面加载)我只是在一个包含公司的页面上工作,该公司包含一个联系人列表,单击时的菜单选项应显示联系人列表。我已经在公司模型下加载了联系人列表,但是!我无法从应该呈现联系人列表的新部分视图中访问它,因为菜单是布局页面中包含的部分视图,因此无法接受模型,因此我无法将模型传递到局部视图中我正在尝试加载,因为菜单部分视图位于布局页面中。
这是一个棘手的情况,我显然可以更改布局以呈现一个新的部分来包含菜单,这样我就可以将新的视图模型传递给它,但是我构建的每个页面都需要引用菜单(这是什么害虫!)我必须在这里遗漏一些东西(考虑到这是我可能的第一个MVC3应用程序)。有什么建议吗?
编辑:我自己更进一步,总之我的布局页面总是可以访问使用它的页面模型,因此我的部分视图包含菜单可以也访问该数据。我在菜单部分视图中编写了一些条件逻辑,用于检查页面,然后根据需要传入数据。
<div class="menu">
<ul>
<li><a href="@Url.Action("Create", "Contact")">New Contact </li>
<li><a href="@Url.Action("Index", "Contact")">Contact List </a></li>
</ul>
@if (Request.Url.PathAndQuery.Contains("/Contact/Details/"))
{
<ul>
<li>@Html.ActionLink("New Activity", "Create", "Activity", new { companyid = 0, contactid = Model.contact.id }, null)</li>
</ul>
}
</div>
以上是菜单部分视图的一小部分示例,但其中包含一个示例,其中为联系人/详细信息页面构建了菜单,并且可以传入 model.contact。 ID 即可。它的工作原理是我的菜单和我的布局没有明确地包含模型,但它感觉不是很整洁。
答案 0 :(得分:5)
如果我正确理解您的问题,您的问题是您不认为您的部分视图可以拥有模型,因为您不希望您的布局具有模型。所以问题是如何在不需要每一个动作来扩展布局所使用的基本模型类型的情况下,将模型放入布局中。
1)在菜单布局中使用Html.Partial
而不是Html.Action
使用return ((BaseController)ViewContext.Controller).MenuData;
,然后您将获得一个获取菜单数据的操作方法。
2)编写自定义WebViewPage并包含类似
的属性{{1}}
现在你甚至不需要在局部视图中使用模型,它可以直接访问数据。
这两个都需要一个菜单属性,其中包含基本模型中可用的所有菜单信息,但如果您网站中的每个页面都需要访问此数据,那么这似乎是合适的。
编辑:为了回应您的整洁问题,听起来您需要部分,这使您能够在相应的视图页面或子布局中自定义菜单的各个部分。
有关部分的概述,请参见http://weblogs.asp.net/scottgu/archive/2010/12/30/asp-net-mvc-3-layouts-and-sections-with-razor.aspx;有关嵌套布局/部分的信息,请参见http://blogs.msdn.com/b/marcinon/archive/2010/12/15/razor-nested-layouts-and-redefined-sections.aspx。