【问题标题】:Asp.net mvc RenderAction RouteData Controller and Action valuesAsp.net mvc RenderAction RouteData 控制器和动作值
【发布时间】:2010-10-17 15:39:54
【问题描述】:

我正在尝试在母版页上创建一个 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; 
        }

【问题讨论】:

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


    【解决方案1】:

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

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

    并渲染它:

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

    现在您应该获得正确的父操作名称。此外,如果此操作仅用作子操作,您可以使用 [ChildActionOnly] 属性对其进行装饰。

    【讨论】:

      猜你喜欢
      • 2011-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-10
      • 1970-01-01
      • 2017-01-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多