2017-02-22 118 views
0

我曾與路由配置規則,包括一個ASP.Net MVC應用這一個:asp.net MVC路由配置

routes.MapRoute(
     "rule1", 
    "{controller}/{action}/{cid}/{language}/{itemID}/{uid}", 
    new { controller = "Home", action = "action1" } 
    , new[] { "MVCApp.Controllers" } 
); 

我剛添加了新的動作與相同數量的參數和我的路由配置變化如下(規則2加):

routes.MapRoute(
     "rule2", 
    "{controller}/{action}/{cid}/{language}/{phoneNumber}/{uid}", 
    new { controller = "Home", action = "action2" } 
    , new[] { "MVCApp.Controllers" } 
); 
routes.MapRoute(
     "rule1", 
    "{controller}/{action}/{cid}/{language}/{itemID}/{uid}", 
    new { controller = "Home", action = "action1" } 
    , new[] { "MVCApp.Controllers" } 
); 

現在,當我叫http://localhost:51650/Home/action2/1/en/1/1它沒有路線action1並拋出異常The parameters dictionary contains a null entry for parameter 'itemID' of non-nullable type 'System.Int64' for method 'System.Web.Mvc.JsonResult action1(System.String, Int32, Int64, Int64)

+0

反轉的順序。添加路由的順序影響路由的工作方式。添加第一個rule1,然後添加rule2 – NicoRiff

+0

@NicoRiff我剛剛更新了異常詳細信息。有什麼辦法,信息不會路由到rule2和路由跳過它,並採取行動中的rule1(對於URL http://本地主機:51650 /主頁/操作2/1/en/1/1)? – VSB

回答

2

您必須首先放置您的rule1,然後放置您的rule2聲明。聲明路由的順序對api很重要,只要請求與路由匹配,那麼api將停止搜索路由並轉到指定的控制器。

這是從Pro ASP.NET Web API書:

根據您的需求,您可能希望有多個Web API應用程序中的 路線。在ASP.NET Web API中,這在 中是完全可以接受的選項,但有一些重要的事情需要注意。 如果您有多條路線,則路線 的註冊順序很重要。當請求進入路由級別時,將掃描路由 集合以查找匹配項。一旦找到匹配項, 搜索停止,其餘路線將被忽略。首先查看第一個登記的 路線,依此類推。

因此,由於您的兩條路線具有相同的參數數量,它將在第一條與請求參數數量匹配的路線上退出。爲了解決這個問題,你可以在你的路由中添加約束條件,這樣你就可以確保什麼值到什麼路由,或者按照規定,將你的路由硬編碼爲rule1中的action1,action2中的rule2作爲@Pavel。

對於行動的硬編碼到航線規則1始終動作1和規則2總是actoin2,用途:{controller}/action1/{cid}/{language}/{itemID}/{uid}的動作1和做動作2相同,規則2

+0

如何在rule2或rule1中硬編碼動作?由於更改訂單將導致其他操作發生相同的錯誤。 – VSB

+0

當有人輸入action1應該去規則1和動作2到規則2? – NicoRiff

+0

我應該注意'phoneNumber'是'string','itemId'是'int',當我顛倒規則的順序時,當信息路由到action2時'phoneNumber'將爲空。 – VSB