2011-08-31 125 views
3

IAM具有控制器等,低於該另一控制器/動作是在路由表重定向到在路由未註冊

public class InternalController : Controller 
{ 
/*this controller is not registered in routes table*/ 

     public ActionResult Foo() 
     { 
     return Content("Text from foo"); 
     } 
} 

未註冊從我想調用哪個被登記在路由表另一控制器/前一個控制器的重定向動作,一個未在路由表中註冊的動作。

public class AjaxController : Controller 
{ 
/*this controller is registered in routes table*/ 

     public ActionResult Foo() 
     { 

      /*FROM HERE HOW DO I RETURN CONTENTS OF 
      controller=InternalController, action = Foo 
      */ 

      /* 
       i tried below piece of code but that doesnt seem to work 
      */ 

      return RedirectToAction("Foo", "InternalController "); 
     } 
} 

定義的路由(只有一個項目加)

public void RegisterRoutes(RouteCollection routes) 
    { 
     routes.MapRoute("Ajax","ajax/{action}",new { 
     controller="Ajax", 
     action="Index" 
     }); 
    } 
+0

*未在路線中註冊的控制器是什麼* *?這對我來說沒有任何意義。 –

+0

如果你的類是'InternalController',那麼你應該通過'RedirectToAction(「Foo」,「Internal」)''重定向到「Internal」控制器(即不是「InternalController」)。 –

+0

@darin「未在路線中註冊的控制器」:表示我沒有在路線表中註冊該控制器。 –

回答

0

現在你已經證明你的路由定義,很明顯,你永遠無法調用任何其它控制器比AjaxController。你只是禁止他們在你的路線,所以InternalController永遠不能送達。你將不得不改變你的路線定義。

取決於你想要達到什麼,以及如何你希望你的URL看起來像你有幾個可能的原因:

  • 保留默認路由
  • 修改現有的路線定義,像這樣:

    routes.MapRoute(
        "Ajax", 
        "{controller}/{action}", 
        new { controller = "Ajax", action = "Index" } 
    ); 
    
+0

這是否意味着它不可能(**,即使不使用重定向**)從'controller = AjaxControler,action = Foo'返回'controller = InternalController,action = Foo'的內容。 –

+0

@Rusi Nova,是的,這就是它的意思。不僅如此,AjaxControler無法實現,而且無處不在,甚至不需要在瀏覽器中輸入一些url或其他內容,因爲您的路由定義方式並不存在這樣的url。您仍然可以保留默認路由(由新項目嚮導生成的路由)。 –

+0

是的,您需要訪問的所有控制器(包括RedirectToAction調用)都需要在路由中註冊 – BlackTigerX

1

如果您選擇不註冊的路線......那麼你很可能在特定位置的文件/控制器會不變。

在這種情況下,只需使用「重定向」方法,而不是「RedirectToAction」。

例如:

return Redirect("~/Internal/Foo"); 
+0

當然沒有路由它不會解決路徑? – TheCodeKing

+0

我已經更新了這個問題。 –

0

您可以重定向多個URL和頁面創建RedirectController:

public class RedirectController : Controller 
{ 
    public ActionResult Index() 
    { 
     var rd = this.RouteData.Values; 
     string controller = rd["controller2"] as string; 
     string action = rd["action2"] as string; 

     rd.Remove("controller2"); 
     rd.Remove("action2"); 
     rd.Remove("controller"); 
     rd.Remove("action"); 

     return RedirectToActionPermanent(action, controller, rd); 
    } 
} 

然後你就可以定義從舊的URL在路由表中重定向:

routes.MapRoute(
null, // Name 
"ajax/foo", 
new { controller = "Redirect", 
     action = "Index", 
     controller2 = "InternalController", 
     action2 = "Foo"} 
); 

這種模式也是有用的,如果您重定向舊網址到新的一個。例如:

routes.MapRoute(
null, // Name 
"default.aspx", // redirect from old ASP.NET 
new { controller = "Redirect", 
action = "Index", 
controller2 = "Home", 
action2 = "Index" } 
);