【发布时间】:2026-02-12 21:25:01
【问题描述】:
在 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”。
如何使该部分视图可供所有站点的控制器使用?
感谢您的帮助。 鹌鹑
【问题讨论】:
-
放入共享文件夹?
-
顺便说一句,如果您想在整个站点共享菜单,您应该考虑将其直接放入母版页,而不是使用
RenderAction包含它 -
我确实把它放在了母版页中。这就是为什么我需要让所有控制器都可以使用子操作。
-
我的意思是菜单是静态内容还是根据登录的用户动态变化的东西?
标签: asp.net-mvc partial