【问题标题】:Unable to pass model into partial view inside layout pages无法将模型传递到布局页面内的局部视图
【发布时间】:2012-04-26 05:32:06
【问题描述】:

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

我偶然发现了对我前进的问题,菜单使用 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>

以上是菜单部分视图的一个小示例,但包含一个示例,其中菜单是为 contact/details 页面构建的,并且能够传入 model.contact。标识。它的工作原理是我的菜单和布局没有明确包含模型,但感觉不是很整洁。

【问题讨论】:

    标签: asp.net-mvc-3 partial-views


    【解决方案1】:

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

    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 了解嵌套布局/部分的信息。

    【讨论】:

    • 感谢您的回复,我对此进行了进一步的修改,因此对我的帖子进行了编辑。
    • @DavidAbraham 编辑了我的答案以获取有关您的新问题的建议。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-01
    • 2020-10-18
    • 1970-01-01
    相关资源
    最近更新 更多