2

我在该布局中有一个布局页面我使用了局部视图,局部视图包含我构建的菜单功能,我将菜单拆分为局部视图以确保它易于维护。菜单被故意放置在布局中,因为它在每个页面中都使用,但是菜单中有条件元素,因此某些选项仅出现在某些页面上。

我偶然发现了对我前进的问题,菜单使用 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。它的工作原理是我的菜单和布局没有明确包含模型,但感觉不是很整洁。

4

1 回答 1

5

如果我正确理解了您的问题,那么您的问题是您认为您的局部视图不能有模型,因为您不希望您的布局有模型。所以问题是如何在不需要每个操作来扩展布局将使用的基本模型类型的情况下将模型放入布局中。

1)而不是Html.Partial在您的布局中使用菜单使用Html.Action,然后您将拥有一个获取菜单数据的操作方法。

2) 编写一个自定义 WebViewPage 并包含一个类似的属性

return ((BaseController)ViewContext.Controller).MenuData;

现在您甚至不需要局部视图中的模型,它可以直接访问数据。

这两者都需要一个包含基本模型中可用的所有菜单信息的 Menu 属性,但是如果您网站中的每个页面都需要访问这些数据,那么这似乎是合适的。

编辑:为了回应您对整洁的关注,听起来您想要部分,这使您能够在适当的视图页面或子布局中自定义菜单的各个部分。

有关部分的概述,请参见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了解嵌套布局/部分的信息。

于 2012-04-14T20:33:27.947 回答