在ASP.NET MVC中,如何使部分视图可用于所有控制器?

时间:2010-05-07 19:25:26

标签: asp.net-mvc partial

在ASP.NET MVC中,如何为所有控制器提供部分视图?我想创建整个站点中常见的导航,但是当我将Html.Action放入我的母版页时,它只适用于与1个控制器关联的视图。

现在,我有一个控制器操作定义如下:

    // GET: GetCategoriesPartial
    [ChildActionOnly]
    public ActionResult GetCategoriesPartial()
    {
        var category = CategoriesDataContext.GetCategories();
        return PartialView(category);
    }

我已经创建了我的部分视图

<%@ Import Namespace="wopr.Models" %>
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl" %>

<ul>
<%
    foreach (var cat in Model as IEnumerable<Category>) {
        %>
        <li><a href="/categories/Details/<%=cat.catID%>"><%=cat.catName%></a></li>
        <%
    }

%>
</ul>

我的母版页看起来像这样:

<%@ Import Namespace="wopr.Models" %>
<%@ Master Language="C#" Inherits="System.Web.Mvc.ViewMasterPage" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title><asp:ContentPlaceHolder ID="TitleContent" runat="server" /></title>
    <link type="text/css" rel="Stylesheet" href="/Content/Site.css" />
</head>
<body>
    <div class="wrap-all">
    <div style="text-align:right;">
        <a href="/">Home</a> | 
        <a href="/games/">Games</a> | 
        <a href="/games/Index2/1">Games <em>(paginated)</em></a> | 
        <a href="/categories/">Categories</a> | 
        <a href="/upload/">Upload</a>
    </div>
        <asp:ContentPlaceHolder ID="MainContent" runat="server">

        </asp:ContentPlaceHolder>


        <!--This errors on any non-CategoryController page.-->
            <%= Html.Action("GetCategoriesPartial")%>
        <!---->

    </div>
</body>
</html>

只要我正在查看由CategoriesController处理的内容,此代码就可以正常工作。如果我转到由不同控制器处理的任何视图,我会得到例外:

  

System.Web.HttpException:在控制器'wopr.Controllers.GamesController'上找不到公共操作方法'GetCategoriesPartial'。

如何将此局部视图提供给所有站点的控制器?

感谢您的帮助。 Quakkels

3 个答案:

答案 0 :(得分:3)

将其放入views\shared文件夹

然而,查看您的错误消息,似乎还会发生其他事情。您无法使用<%=Html.Action%>呈现视图。您应该使用<%=Html.RenderPartial("ViewName")%>

答案 1 :(得分:2)

使用MVC2,您现在可以直接在视图中呈现操作。如果未从同一控制器呈现操作,则需要指定操作所在的控制器。如果以这种方式包含部分视图,则部分视图可以位于控制器的视图文件夹中(而不是共享)。请注意,它不会从当前操作中获取ViewData - 仅限于您正在调用的操作所设置的。

<% Html.RenderAction( "GetCategoriesPartial", "Category" ) %>

<%= Html.Action( "GetCategoriesPartial", "Category" ) %>

答案 2 :(得分:1)

只是为了添加ropstah的响应,asp.net-mvc中的约定是让控制器首先查看与其本身相同名称(少于控制器位)的文件夹,然后在共享文件夹下查找查看是否找不到。