2010-12-14 37 views
1

我有一個Products控制器與Details的行動,都有一個ID和彈頭的作品如下:ASP.NET MVC:路由需要準確URL工作

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

的網址:localhost/Products/Details/1localhost/Products/Details/1/my-slug作品。 但是,將ProductDetails路線放在頂部打破了我的整個應用程序。要進入我的主頁,我的網址必須如下所示:localhost/Home/Index

localhost/Home或此事的任何控制器不起作用。它要求在這些操作中有一個可爲空的參數。

錯誤:

The parameters dictionary contains a null entry for parameter 'id' of non-nullable type 'System.Int32' for method 'System.Web.Mvc.ActionResult Details(Int32)' in 'MyProject.Controllers.ProductsController'. An optional parameter must be a reference type, a nullable type, or be declared as an optional parameter.

回答

3

試試這個:你的默認網址定義之前比賽的每一個URL

routes.MapRoute(
      "ProductDetails", // Route name 
      "Products/{action}/{id}/{title}", // URL with parameters 
      new { controller = "Products", action = "Details", id = "", title = UrlParameter.Optional } // Parameter defaults 
      ); 

路線。您已將控制器和操作字段的默認值。當您致電http://localhost時,它會查找ProductsController的Details方法並找到它。由於id有一個空的字符串值,你會得到空的異常。

上面的路線有限制。它匹配從"Products"開始的URL。所以它不會破壞你的默認路線。

0

添加數約束(\ d)向所述第一路由可以解決這個問題,因爲在頂部的路線將是無用的,而不一個有效ID。

+0

我剛剛那樣做了。它的工作,謝謝。爲什麼?你能解釋一下這2條路線是如何工作的嗎? – 2010-12-14 18:58:12

+0

由於第二個路由localhost/Home與您定義的路由定義相匹配,並且路由路由localhost/Home沒有URL的id組件,所以您會收到異常,因爲MVC框架試圖分配null因爲缺少ID參數和Int32不能分配一個空值。 – Chandu 2010-12-15 01:39:56