2013-04-25 30 views
2

我一直在處理一些關於路線的問題。我已經定義了路線,但我不斷收到404這裏是路線:儘管我繪製了我的路線,但我仍然得到了404個事件

routes.MapRoute(
    name: "Default", 
    url: "{controller}", 
    defaults: new { controller = "Login", action = "Login" } 
); 

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

routes.MapRoute(
    name: "Calendar", 
    url: "{controller}/{action}", 
    defaults: new { controller = "Calendar", action = "Index" } 
); 

routes.MapRoute(
    name: "Act", 
    url: "{controller}", 
    defaults: new { controller = "Act", action = "New" } 
); 

localhost:51081/login works! 
localhost:51081/Home/25.04.2013 works! 
localhost:51081/act doesnt work! 
localhost:51081/calendar/index doesnt work! 

這裏的「登錄」和「家」的作品,但「日曆」和「行爲」犯規。當我將「日曆」映射到頂端時,「家庭」映射不起作用。你如何繪製你的網頁?

基本上我不想動作名稱出現在網址前:http://localhost:51081/Home/Home/25.04.2013.我想看看它像http://localhost:51081/Home/25.04.2013 or http://localhost:51081/calendar

+1

默認通常是定義的最後一個路由,請嘗試將它移動到下面的行爲 – DGibbs 2013-04-25 13:54:48

+1

失敗的路由是什麼?另外:您的「行爲」路線基本上是第一條路線的重新聲明,具有不同的默認值;非常艱難:到那時,它已經達到了第一條路線。同樣,您的「日曆」路線是*第二條*路線的重述。只是不同的名字。 – 2013-04-25 13:55:30

+1

請提及您嘗試訪問的網址。 – 2013-04-25 13:56:30

回答

3

像@MarcGravell說:你只添加特殊規則的例外

在你的情況路線日曆和家庭是相同的。 你可以映射你的路由通過與家庭更換{}控制更加具體,導致這條路線是不是動態的,確實是一個例外(它忽略動作)

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

法是一樣的日曆,以便那些你不需要兩條路線。只需致電Act/New,而不是Act。

爲默認使用:

routes.MapRoute(
    name: "Default", 
    url: "{controller}/{action}", 
    defaults: new { controller = "Login", action = "Login" } 
); 

而且把它放在你的路由底部偏離方向。

+0

這個答案很好,非常有用,謝謝。但我想處理我的路線更具活力。如果我像你說的那樣做,那麼我必須寫很多路由 – Ktt 2013-04-25 14:27:45

+1

@Ktt否,你只爲*例外*添加特殊規則;默認是在那裏,以趕上休息。實際上,在我的項目中,我們以不同的方式進行路線映射 - 我們用我們希望它們匹配的模式來標記動作本身。工作得很好。 – 2013-04-25 14:33:14

+0

那麼這是否會涉及所有? :* routes.MapRoute( name:「Default」, url:「{controller}」, 默認值:new {controller =「Login」,action =「Login」} ); *適用於* localhost:bla/login *但不代表* localhost:bla/act * – Ktt 2013-04-25 14:37:55

1

記住asp.net路線在您將它們添加到MapRoute表的順序進行評估。

您的「默認」和「行爲」路由是相同的,因爲它們具有相同的模式。 「行動」可能永遠不會受到打擊。

此外,您的「默認」路線是非常通用的,並且大多數請求都會滿足它。您應該按照最具體的(例如硬編碼路線)將路線添加到最不具體的(例如所有佔位符)。

所以,如果我有foo/bar的請求,它會掉到你的「默認」路由,因爲「foo」將被解釋爲控制器 - 然後它將尋找一個「bar」不存在。所以你會得到一個404.

你的「家」和「日曆」路線也是相同的模式,所以只有一個會被擊中(這將是第一個定義)。

使您的路線更具體,並從最具體到最少定義它們。

祝你好運!

2
routes.MapRoute(
      name: "Default", 
      url: "{controller}", 
      defaults: new { controller = "Login", action = "Login" } 
     ); 

這定義匹配//anything的路線; /將嘗試使用LoginController.Login,並且/anything將嘗試使用anythingController.Login。請注意,此路線在任何時候都不允許它接收除Login以外的任何「行動」。

如果特羅所有這些之外,並使用類似:

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

然後將匹配任何//anything/anything/anythingelse

  • /將映射到HomeController.Index
  • /anything將映射到anythingController.Index
  • /anything/anythingelse將映射到anythingController.anythingelse

希望這解釋了映射違約條款是如何工作的。

如果您有任何特定路線,他們應該添加之前這個一攬子默認值。

+0

我幾乎明白了,謝謝。那麼** routes.MapRoute( 名稱:「Default」, url:「{controller}/{action}」, 默認值:new {controller =「Login」,action =「Login」})之間的區別是什麼? ); routes.MapRoute( 名: 「家」, 網址: 「{控制器}/{}日期」, 默認:新{控制器= 「家」,行動= 「家」,日期= UrlParameter.Optional} ); ** – Ktt 2013-04-25 14:07:43

+0

@Ktt第二個總是使用操作'Home',不管指定什麼 - 第一個從url的第二部分採取行動,默認爲'Login';第一個默認路由'/'到'LoginController',第二個默認路由'/'到'HomeController';但是請注意,它們按插入順序處理:第一場比賽勝出。 – 2013-04-25 14:11:27

+0

基本上我不希望動作名稱出現在網址例如:http:// localhost:51081/Home/Home/25.04.2013.'我想看到它像'http:// localhost:51081/Home/25.04 .2013或http:// localhost:51081/calendar' – Ktt 2013-04-25 14:22:20

相關問題