2013-04-06 44 views
2

我試圖指定一個路徑在MVC4忽略控制器名稱,如果提供一個特定的操作名稱。例如。使用MVC路由覆蓋控制器名稱時提出了具體行動

mysite.com/AnyControllerNameHere/SpecificAction - 會讓我指定控制器和操作使用,同時

mysite.com/AnyControllerNameHere/NotSpecificAction - 會帶我的的AnyControllerNameHere控制器和NotSpecificAction方法類似MVC默認。

我試圖編碼的東西,但它似乎並沒有做我想做的事情。全航線的配置僅僅是MVC默認加我試圖這樣做,所以...

public static void RegisterRoutes(RouteCollection routes) 
    { 
     routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

     routes.MapRoute(
      "SpecificAction", 
      "{controller}/SpecificAction", 
      new { controller = "Home", action = "SpecificAction" } 
      ); 


     routes.MapRoute(
      name: "Default", 
      url: "{controller}/{action}/{id}", 
      defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
     ); 
    } 
+0

路由聲明的順序很重要。如果你的''SpecificAction''在**默認路由聲明之前**,它應該工作。所以請你完整的路線配置! – nemesv 2013-04-06 18:36:23

+0

所以是唯一的方法來做到這一點把SpecificAction放在{controller}之前?我可以讓它工作,但這不是我想要做的。 – 2013-04-06 18:52:15

+0

你期望它做什麼與默認路由選擇不同?你已經明確地告訴它在第一條路線上去了SpecificAction,所以它會完成默認路由在同一個場景中做的事情......你確定它沒有按照你想要的方式工作嗎? – 2013-04-06 19:13:48

回答

4

當你這樣寫:

routes.MapRoute(
    "SpecificAction", 
    "{controller}/SpecificAction", 
    new { controller = "Home", action = "SpecificAction" }); 

您打算重寫控制器。但是,第三個參數不能用於覆蓋的參數。它僅爲默認值提供任何尚未由URL提供的參數。

所以,你需要的是一個路線模板,設置控制器參數,使默認生效:

routes.MapRoute(
    name: "SpecificAction", 
    url: "{ignored}/SpecificAction", 
    defaults: new { controller = "Home", action = "SpecificAction" }); 
+0

謝謝,這正是我想要的,並且很容易理解。 – 2013-04-08 16:37:31

0

我不認爲這可以用MVC內置的路由可以輕鬆實現。你可以考慮寫一個自定義的路由處理,或者做類似下面有默認路由做這份工作適合你:

public class BaseController : Controller 
{ 
    public ActionResult SpecificAction() 
    { 
     return RedirectToAction("SpecificAction", "Home"); 
    } 
} 

public class SomeController : BaseController 
{ 
    /* ... */ 
} 

public class HomeController : BaseController 
{ 
    public override ActionResult SpecificAction() 
    { 
     /* Do whatever */ 
    } 
} 
0

要做到這一點是使用一個路由約束的最簡單方法。

routes.MapRoute(
    "SpecificAction", 
    "{anyController}/{specificAction}", 
    new {controller="Home", action="SpecificAction"}, 
    new {specificAction = "SpecificAction" } 
); 

這裏的關鍵是,你不使用默認的{控制器}和{}的行動,而是不同的東西(它們可以是任何東西),但使用路由約束將其鎖定到SpecificAction行動。

Wim的方法也適用。

相關問題