我正在尝试在Master页面上创建一个RenderAction方法,该方法将根据当前控制器和操作动态生成侧栏。在视图中调用RenderAction时,它将使用该特定RenderAction方法的控制器和操作进行填充。例如,如果我在“Home”的控制器和“Index”的操作上,我期望GenerateSideBar方法中的“Home”和“Index”。相反,我得到了“Home”的控制器和“RenderSideBar”的动作。谢谢你的帮助!
我的母版页面视图:
<div class="side-bucket">
<%
string Controller = ViewContext.RouteData.Values["Controller"].ToString();
string Action = ViewContext.RouteData.Values["Action"].ToString();
%>
<% Html.RenderAction("RenderSideBar", "Home", new { controller = Controller, action = Action }); %>
控制器操作:
public ActionResult GenerateSideBar(string controller, string action)
{
switch (controller.Trim().ToLower())
{
case "member" :
return View(@"sidebar\MemberSidebar");
default:
break;
}
return null;
}
答案 0 :(得分:5)
问题是控制器和操作参数名称是特殊的,因为在您的路由中使用,并且在默认模型绑定器尝试设置其值时将优先。只需将它们重命名为:
public ActionResult GenerateSideBar(string currentController, string currentAction)
{
...
}
并渲染它:
<% Html.RenderAction("RenderSideBar", "Home",
new { currentController = ViewContext.RouteData.Values["controller"],
currentAction = ViewContext.RouteData.Values["action"] }
); %>
现在您应该获得正确的父操作名称。此外,如果此操作仅用作子操作,则可以使用[ChildActionOnly]
属性对其进行修饰。