2010-10-17 42 views
2

我想在Master頁面上創建一個RenderAction方法,它會根據當前控制器和動作動態生成一個側欄。在視圖中調用RenderAction時,將使用該特定RenderAction方法的控制器和操作來填充RenderAction。例如,如果我在「Home」的控制器和「Index」的操作中,我期待GenerateSideBar方法中的「Home」和「Index」。相反,我得到了「家」的控制器和「RenderSideBar」的動作。謝謝你的幫助!Asp.net mvc RenderAction RouteData控制器和動作值

我的母版頁查看:

<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; 
     } 

回答

4

的問題是因爲在你的路由使用,將優先考慮該控制器和動作參數名稱是特殊的時候默認模式聯編程序嘗試設置其值。只要像這樣重命名它們:

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

,並使其:

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

現在你應該得到正確的父動作名稱。此外,如果此操作僅用於兒童動作,則可以用[ChildActionOnly]屬性對其進行修飾。

+0

工作!感謝您的幫助Darin! – Zaffiro 2010-10-18 00:42:21