2011-09-22 180 views
0

我添加了路由到我的解決方案,以便在地址欄中使用更友好的URL。路由和反射問題

我開始解決方案,當我翻閱我的收藏夾鏈接時,我看到網址.../Affaire /收藏夾(下圖)。這一個對我來說可以。

enter image description here

當我側翻我回收站的鏈接,我看到URL ../Affaire/Deleted(下圖)。這一個對我來說可以。

enter image description here

然後我點擊回收站鏈接,我導航到相應的頁面和URL地址欄中顯示對我來說(下圖)OK。

enter image description here

接下來,我再次翻轉收藏夾鏈接(圖片下方),我看到了網址../Affaire/Delete?OnlyFavorite=true!這不好。

enter image description here

路由現在檢索的屬性不是從我的鏈接,但是從積極的網址!這個屬性被命名爲OnlyFavorite,我不想要這個屬性。這是「反思」。請注意,我的所有路由都使用相同的控制器和相同的操作,但使用不同的路由屬性。

下面是我使用的一些鏈接。

示例導航到最喜愛的網頁:

@Html.ActionLink("Favorites", "SearchAffaires", new { OnlyFavorite = true }) 

示例導航到回收站頁:

@Html.ActionLink("Recycle bin", "SearchAffaires", new { StatusCode = "DELETED" }) 

這裏是我的路線:

 routes.MapRoute(
     "Affaire Status Open/Closed/Deleted",         // Route name 
     "{controller}/{StatusCode}",           // URL with parameters 
     new { action = "SearchAffaires" },          // Parameter defaults 
     new { controller = "Affaire", StatusCode = "^Open$|^Closed$|^Deleted$" }// Contraints 
     ); 

     routes.MapRoute(
     "Affaire Only Favorite",            // Route name 
     "{controller}/Favorite",            // URL with parameters 
     new { action = "SearchAffaires", Page = 1, OnlyFavorite = true },  // Parameter defaults 
     new { controller = "Affaire" }           // Contraints 
     ); 

你有任何想法我怎麼能繼續避免這種行爲?

我不希望路由通過反射從我當前的URL中獲取名爲OnlyFavorite的屬性。我已經嘗試在動作鏈接上傳遞OnlyFavorite = null,但它不起作用:路由說「好的,我沒有鏈接本身的OnlyFavorite值,但是我只有URL的OnlyFavorite,所以我使用它!」。

回答

0

當您處於Deleted頁面時,由於StatusCode令牌等於已刪除,因此正在處理鏈接,因此第一條路徑得到滿足。更改您的鏈接如下:

@Html.ActionLink("Favorites", "SearchAffaires", new { StatusCode = String.Empty, OnlyFavorite = true }) 

修訂

最好的解決辦法是扭轉你的路線。一般來說,最具體的路線應該總是先行,而且以後應該有更多的通用路線。由於「只有最喜歡的Affaire」路線更具體,因此應該始終先行。如果它是滿足的第一條路線,那就應該解決你的問題。

更新#2

我跑的測試,所有的環節都正確生成,當我設置的路線如下:

 routes.MapRoute(
      "Affaire Only Favorite",          // Route name 
      "Affaire/Favorite",           // URL with parameters 
      new { controller = "Affaire", action = "SearchAffaires", 
       StatusCode = String.Empty, Page = 1, OnlyFavorite = true } // Parameter defaults 
     ); 

     routes.MapRoute(
      "Affaire Status Open/Closed/Deleted",         // Route name 
      "{controller}/{StatusCode}",            // URL with parameters 
      new { action = "SearchAffaires" },          // Parameter defaults 
      new { controller = "Affaire", StatusCode = "^Open$|^Closed$|^Deleted$" } // Constraints 
     ); 

此外,以下更通用的路由也正確生成:

 routes.MapRoute(
      "Favorite",             // Route name 
      "{controller}/Favorite",          // URL with parameters 
      new { action = "Search", 
       StatusCode = String.Empty, Page = 1, OnlyFavorite = true } // Parameter defaults 
     ); 

     routes.MapRoute(
      "Status Open/Closed/Deleted",     // Route name 
      "{controller}/{StatusCode}",      // URL with parameters 
      new { action = "Search" },      // Parameter defaults 
      new { StatusCode = "^Open$|^Closed$|^Deleted$" } // Constraints 
     ); 

對於更通用的路由工作,我不得不重新命名行動Search,我不得不將每個鏈接從SearchAffaires更改爲Search。

+0

我嘗試的String.Empty,但它不工作。路由仍使用來自URL的值(「DELETED」)。我也嘗試使用StatusCode =(string)null,但仍然不行。 – Bronzato

+0

我已經嘗試顛倒我的路線,但問題仍然存在:路由系統總是嘗試從routeValues或活動URL獲取任何屬性。 – Bronzato

0

那麼,你可以使用Html.RouteLink助手來精確指向所用的路線。但是,正如@counsellorben指出的那樣,您應該將更具體的路線設置爲第一條路線。

如果沒有問題,以顯示你的網址,如「AFFAIRE /收藏/真」,那麼你可以使用下面的例子:

routes.MapRoute(
     "Affaire Only Favorite",            // Route name 
     "{controller}/Favorite/{OnlyFavorite}",            // URL with parameters 
     new { action = "SearchAffaires", Page = 1, OnlyFavorite = ""},  // Parameter defaults 
     new { controller = "Affaire" }           // Contraints 
     );