2017-08-23 39 views
2

我有這些路由定義工作:此自定義路線不MVC5

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

      routes.MapRoute(
       name: "InboxToCompose", 
       url: "Asistencia/Mensajeria/Componer/{origen}", 
       defaults: new { controller = "Mensajeria", action = "Componer", area = "Asistencia" } 
      ); 

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

路線「InboxToCompose」應該映射到這個方法:

// GET: /Asistencia/Mensajeria/Componer/origen 
    public ActionResult Componer(string origen) 
    { 

    } 

這種方法被放置在「Mensajeria」控制器在「Asistencia」地區。

當我打電話有鑑於此:

Url.Action("Componer", "Mensajeria", new { area = "Asistencia", origen = "Inbox" }) 

生成的URL是

/Asistencia/Mensajeria/Componer?origen=Inbox 

這樣的話,我可以看到,「奧利」參數填充值「收件箱」時,該方法調用。

不過,我希望它只是

/Asistencia/Mensajeria/Componer/Inbox 

如果我使用的URL在瀏覽器中調用該方法,但與「奧利」參數等於空。

對此有何建議?

+0

如果你有區域,您需要在您的'RouteConfig'文件,然後註冊。參考[這個問題/答案](https://stackoverflow.com/questions/13454699/how-to-register-areas-for-routing)舉例 –

回答

0

了很多嘗試和錯誤之後,我已經找到了解決辦法。

事實是,由於該控制器屬於一個區域,所以應該在AreaRegistration派生類中定義路由。

我發現,這個類包含此:

public override void RegisterArea(AreaRegistrationContext context) 
{ 
    context.MapRoute(
     "Asistencia_default", 
     "Asistencia/{controller}/{action}/{id}", 
     new { action = "Index", id = UrlParameter.Optional } 
    ); 
} 

所以我提出我的自定義圖路線從RouteConfig到AsistenciaAreaRegistration類。這樣它的工作。正確接收使用Url.Action的URL生成和參數。

我意識到這一點,閱讀這個網頁後:https://blogs.msdn.microsoft.com/webdev/2013/10/17/attribute-routing-in-asp-net-mvc-5/

這頁講述了屬性的路由,所以我想一個屬性附加傷害添加到我的動作,但是,當我打電話AreaRegistration.RegisterAllAreas();,一運行時異常被拋出,告訴該區域已經在AsistenciaAreaRegistration類中定義。

所以我決定把MapRoute作爲一個邏輯演繹推到那裏。

我更喜歡用這種方式添加路線而不是屬性路由,因爲這樣我就可以將所有的路由放在一起,因此在未來更容易維護。

問候

海梅

0

請在下面嘗試航線配置

routes.MapRoute(
      name: "InboxToCompose", 
      url: "Asistencia/Mensajeria/Componer/{origen}", 
      defaults: new { controller = "Mensajeria", action = "Componer", area = "Asistencia" , origen = ""} 
     ); 
+0

沒有成功...參數與「?」一起傳遞。 – jstuardo

+0

我嘗試過使用屬性路由,添加屬性並調用routes.MapMvcAttributeRoutes();同時註冊路線。在這種情況下,404與Asistencia/Mensajeria/Componer和Asistencia/Mensajeria/Componer/Inbox一起顯示 – jstuardo

0

你試過Url.RouteUrl?您不必傳遞操作和控制器,而是按照RegisterRoutes中定義的那樣傳遞自定義路由的名稱。更換與此Url.Action線,

Url.RouteUrl("InboxToCompose", new { area = "Asistencia", origen = "Inbox" }) 
+0

此方法調用工作。 – jstuardo

+0

@jstuardo很高興聽到!如果您發現答案有幫助,那麼請不要忘記加註或推銷爲已接受的方式。祝你好運! –

+0

錯誤警報,抱歉..此方法會生成正確的URL,但實際上並未傳遞該參數。 – jstuardo