2013-06-03 93 views
5

我試圖設置自定義的路由具有以下映射路徑asp.net-MVC路由問題:參數字典包含參數

編輯無效項:我的全路徑配置

routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

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

     #region FixtureAdmin 

     routes.MapRoute(
      name: "FixtureEdit", 
      url: "{controller}/{action}/{id}", 
      defaults: new { controller = "FixtureAdmin", action = "Edit", id = UrlParameter.Optional } 
     ); 

     #endregion 

     #region Results 

     routes.MapRoute(
      name: "ResultAdd", 
      url: "{controller}/{action}/{fixtureId}", 
      defaults: new { controller = "Result", action = "Add", fixtureId = UrlParameter.Optional } 
     ); 

     #endregion 

而且我的控制器代碼爲

public ActionResult Add(int fixtureId) 
    { 
     // return model to view etc.. 
    } 

即使我已將該參數指定爲可選,但即使出現異常。

參數字典包含參數無效項「fixtureId」

奇怪的是,如果我更改添加操作的參數,只是「身份證」,那麼下面的URL將工作結果/添加/ 1。我很困惑,是否有一些默認路由覆蓋了我的自定義路由?爲什麼要將參數更改爲'Id'?

編輯

只是爲了測試,我添加了另一個參數動作

public ActionResult Add(int? fixtureId, int? testId) 

我然後相應地編輯的路線,現在它的作品,所以我認爲它是與默認路由的問題。

+0

是他們的任何其他途徑。如果你想能夠調用之前或之後該 – rajansoft1

+1

還配置'添加'沒有指定id,'fixtureId'應該是可以爲空的''int? fixtureId'。路由上下文中的「可選」意味着它不必位於URL中,以便您可以執行像'public ActionResult Add(){/ * no parameters * /}' – Alex

+0

只有我能想到的你使用的是不可空的int嗎? Id很可能會融入到MVC框架中,因此可能會有所不同。 – David

回答

6

在您的Controller Action中使用一個可爲空的int。

public ActionResult Add(int? fixtureId) 
{ 
    // return model to view etc.. 
} 

但問題是,如果這確實是一個ID,如果用戶請求空/空ID,它會如何反應?這個ID是你數據庫中的關鍵嗎?如果您能夠處理或提供缺省頁面(如果ID爲空/空),則可以將其設置爲空。

編輯:

這是因爲ASP.NET會認爲你要求一個身份不明的參數是id,你的情況,Results/Add/11不明。如果你想使用fixtureId來使代碼工作,你應該使用Results/Add?fixureId=1。最終,這不是因爲路由,而是因爲Action中的參數。

EDIT2:

而且,你遇到有被稱爲路由衝突。您的路線與Default衝突。您可以嘗試申請constraints

+0

我可以讓它爲空並相應地處理它。問題是,當我實際上通過Result/Add/1傳入一個值時,例如傳入的值始終爲空。 – nik0lias

+0

查看我的編輯。 – aiapatag

+1

好吧,看起來這樣就足夠了,如果可能,我想從用戶那裏隱藏參數,但可能必須在發佈表單時這樣做,謝謝。 – nik0lias

1

看看這種添加開發人員稱之爲'NullableConstraint'的方法clicky link因此,如果提供了可選參數,您可以對其值進行一些檢查。

還看看接受的答案後的答案看起來更簡單,更乾淨的解決方案。

2

2, 從您的文章,我認爲你的問題是把你的自定義路由的默認後,像這樣:

routes.MapRoute(
      "Default", // Route name 
      "{controller}/{action}/{id}", // URL with parameters 
      new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults 
     ); 

     routes.MapRoute(
     name: "ResultAdd", 
     url: "{controller}/{action}/{fixtureId}", 
     defaults: new { controller = "Home", action = "Add", fixtureId = UrlParameter.Optional } 

這樣: 1 /異常「的參數字典包含參數「無效項fixtureId如果你沒有給出任何動作鏈接或路由表單的具體路由名稱,那麼''會出現,因爲MVC將使用默認路由來路由。所以,你需要給出具體的航線名稱,自定義路線可以算出,像這樣:

@Html.ActionLink("Test custom Route", "Add", "Home", new { fixtureId = 1 }, "ResultAdd") 

歡呼