代码之家  ›  专栏  ›  技术社区  ›  Zaffiro

Asp.net mvc RenderAction RoutedData控制器和操作值

  •  3
  • Zaffiro  · 技术社区  · 14 年前

    我试图在母版页上创建一个RenderAction方法,该方法将基于当前控制器和操作动态生成一个侧栏。当在视图中调用RenderAction时,它将填充该特定RenderAction方法的控制器和操作。例如,如果我在Home的控制器上,并且在Index的action上,那么在generatesibar方法中我期望“Home”和“Index”。相反,我得到了家的控制器和渲染器的动作。谢谢你的帮助!

    我的母版页视图:

       <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 回复  |  直到 14 年前
        1
  •  5
  •   Darin Dimitrov    14 年前

    问题是控制器和操作参数的名称是特殊的,因为它们在路由中使用,并且在默认模型绑定器尝试设置它们的值时将优先使用。只需将其重命名为:

    public ActionResult GenerateSideBar(string currentController, string currentAction)
    {
        ...
    }
    

    呈现它:

    <% Html.RenderAction("RenderSideBar", "Home", 
        new { currentController = ViewContext.RouteData.Values["controller"], 
              currentAction = ViewContext.RouteData.Values["action"] }
    ); %>
    

    现在您应该获得正确的父操作名称。另外,如果此操作仅用作子操作,则可以用 [ChildActionOnly] 属性。