Asp.net mvc RenderAction RouteData控制器和Action值

时间:2010-10-17 15:39:54

标签: asp.net-mvc asp.net-mvc-2

我正在尝试在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; 
        }

1 个答案:

答案 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]属性对其进行修饰。