ASP.NET MVC RenderAction 路由数据控制器和操作值

3
我希望在母版页上创建一个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个回答

5
问题在于控制器和操作参数名称非常特殊,因为它们在路由中使用,并且会在默认模型绑定程序尝试设置它们的值时优先执行。只需将它们重命名如下:
public ActionResult GenerateSideBar(string currentController, string currentAction)
{
    ...
}

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接