2015-02-05 56 views
4

比方說,我只有這條路:瞄準在其他控制器相同的操作方法生成傳出URL

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

我們可以看到,我們的啓動頁面將Home/Index

而且我們說,我已經創建的視圖使用此代碼錨元素:

@Html.ActionLink("This targets another controller","Index", "Admin") 

當我渲染視圖,你會看到生成以下HTML:

<a href="/Admin">This targets another controller</a> 

我們的要求對於以Admin控制器上的Index操作方法爲目標的URL,已通過ActionLink方法表示爲/Admin。路由系統非常聰明,它知道應用程序中定義的路由默認使用Index操作方法,允許它省略不需要的段。

,問題是:

如果我改變的路線:

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

爲:

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

接着,下面的HTML將生成:

<a href="/Admin/Index">This targets another controller</a> 

你能解釋一下我爲什麼?

+0

我會認爲這條路線會有問題。有兩個模式段是可選的,除非你有'/ Admin/Index // 4',否則'/ Admin/Index/4'的意思是id = 4或者name = 4是不確定的。 – Tejs 2015-02-05 17:43:56

+0

您是否在項目中使用區域? – NightOwl888 2015-02-05 19:39:26

+0

只有最後一個參數可以是可選的。 – 2015-02-06 02:24:24

回答

2

兩個:

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

和:

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

無效路由定義,因爲只有一個路線的最後一段可以是可選的。否則,路由引擎無法消除您的路由歧義。

現在回到你原來的問題,爲什麼對於這些​​路線框架不推斷/Index部分。這是因爲框架,評估你的路由模式時,看到這一點:

{controller}/{action}/{id}/{name} 

請參閱{id}部分路線的?當分析了這種模式事先知道該{action}部分之後(在你的情況{id})一非可選段,你必須始終存在。而且由於它知道這一點,很明顯,它不會很聰明,省略了部分,甚至不嘗試。另一方面,您可以指定最後一個段的默認值,並且在生成具有此值的路由時將省略該值。

+0

現在,這是有道理的。 *當它分析這種模式時,它事先知道{action}部分後面跟着一個必須指定的非可選參數id。*非常感謝答案。 但是,一個奇怪的是,我找不到任何官方消息來源表明對可選參數的限制。 – 2015-02-09 18:21:11

相關問題