2011-11-27 74 views
2

我有這個RegisterRoute功能MVC3路由表錯誤

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

    routes.Add("JsActionRoute", JsAction.JsActionRouteHandlerInstance.JsActionRoute); 
    routes.MapRoute(
     "Default", // Route name 
     "{controller}/{action}/{id}", // URL with parameters 
     new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults 
    ); 
} 

凡JsActionRoute是這樣的路線。

public static readonly Route JsActionRoute = new Route("JsAction", 
               new JsAction.JsActionHandler()); 

我希望所有到JsAction /的鏈接都應該由我的coustom路由來處理。

現在,當簡單地調用@Html.ActionLink,MVC3創建一個有關JsAction一個鏈接,我不明白爲什麼。

@Html.ActionLink("About","About") -> JsAction?Action=About&Controller=Index

+0

你可以發佈JsActionHandler代碼嗎? – wnascimento

+0

JsActionHanlder簡單地返回HttpHanlder管理要求(和進口一些js文件將其寫入到響應。) 沒有與RouteTable優先壞事,但我不明白爲什麼MVC選擇JsAction路線產生ActionLinks。 – Vincenzo

回答

1

路線以相同的順序被評估,因爲它們是登記。您可以使用RouteLink明確指定路線名稱:

@Html.RouteLink("About", "Default", new { action = "About" }) 

如果逆定義的順序,然後鏈接會正確生成,但您的自定義路線將因爲沒有什麼歧義不能請求JsAction/ URL時,打這個URL來自默認路由。

你必須讓沒有這樣的衝突重新考慮你的路由結構。你可以使用約束。請記住,默認路由非常熱切,如果不限制它,它通常會優先。

一種可能性是定義一個控制器和動作爲自定義路線:通過指定一個控制器和動作

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

    routes.Add("JsActionRoute", JsAction.JsActionRouteHandlerInstance.JsActionRoute); 

    routes.MapRoute(
     "Default", 
     "{controller}/{action}/{id}", 
     new { controller = "Home", action = "Index", id = UrlParameter.Optional }, 
    ); 

} 

,然後約束自定義路由將被執行:

public static readonly Route JsActionRoute = new Route(
    "JsAction", 
    new RouteValueDictionary(new { action = "JsAction", controller = "Foo" }) 
    new JsAction.JsActionHandler() 
); 

另一種可能性是反轉路線的定義順序並約束默認路線:

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

    routes.MapRoute(
     "Default", 
     "{controller}/{action}/{id}", 
     new { controller = "Home", action = "Index", id = UrlParameter.Optional }, 
     new { controller = "^((?!JsAction).)*$", action = "^((?!JsAction).)*$" } 
    ); 

    routes.Add("JsActionRoute", JsAction.JsActionRouteHandlerInstance.JsActionRoute); 
} 
+0

謝謝,它的工作原理,但我不喜歡這個解決方案。 是否有任何其他的方式來十個分量缺省路由,並在同一時間有我的處理程序來處理所有的請求JsAction /網址是什麼? – Vincenzo

+0

@Vincenzo,沒有,因爲像一個URL'JsAction /'不能自定義路線和默認路由之間消除歧義。順序很重要,所以如果您在默認路線之前註冊您的路線,它將始終使用。 –

+0

有沒有其他解決方案,即使不使用其他路由處理程序? – Vincenzo