2016-05-30 205 views
0

期間不通過我定義了以下路線在我RouteConfig.cs友好的URL:ASP.NET MVC:參數URL路由

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

routes.MapRoute(
    name: "CreateChildRoute", 
    url: "Admin/MaterialPaymentRequestSbuItem/CreateChild/{parentId}", 
    defaults: new { controller = "MaterialPaymentRequestSbuItem", action = "CreateChild", parentId = UrlParameter.Optional } 
); 
routes.MapRoute(
    name: "Default", 
    url: "{controller}/{action}/{id}", 
    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }, 
    namespaces: new[] {"ProjectManager.Controllers"} 

); 

然而,當我打電話:http://localhost:46813/Admin/MaterialPaymentRequestSbuItem/CreateChild/23 空值傳遞給控制器​​:

public ActionResult CreateChild(int? parentId){ 
    ..... 
} 

但調用http://localhost:46813/Admin/MaterialPaymentRequestSbuItem/CreateChild?parentId=32 作品沒有問題,並將它應該是參數。

P.S. Admin是我的應用程序中定義的區域。 這裏是http://localhost:46813/Admin/MaterialPaymentRequestSbuItem/CreateChild?parentId=2路線調試器的輸出: enter image description here

+0

你顯示的代碼工作正常。你是如何產生網址的? –

+0

@StephenMuecke我手動測試應用程序上面生成的URL上面,但是有沒有其他測試方法?我嘗試了RedirectToAction和這樣的東西,它將以這種模式創建URL('.../CreateChild?parentId = 32'),例如:@Html.ActionLink(「Create New Item」,「CreateChild」,new {parentId = @ ViewBag.ParentID},null)' – VSB

+0

它需要爲'@ Html.ActionLink(「Create New Item」,「CreateChild」,「MaterialPaymentRequestSbuItem」,new {parentId = @ ViewBag.ParentID},null) '這將工作正常,並生成'..../Admin/MaterialPaymentRequestSbuItem/CreateChild/23'。如果不是,那麼你還沒有向我們展示導致問題的其他事情。 –

回答

3

從我可以看到你的路由表看起來是正確的,那裏面有一個錯字,但它似乎整個所以我猜那是相當一致的不是一問題。

與teo van kot所說的相反,你總是希望首先從最具體的路線開始,而最普通的路線最後纔會出現,因爲只有第一條路線纔會被使用。

我用來調試我的路線的一個有用的工具是Phil Haak的Route Debugger。它可以讓你看到什麼路線被選擇,更有用的是哪些參數被映射,並且可以通過安裝NuGet

+0

我把路由調試的輸出,它對你有幫助嗎? – VSB

+1

您有另一條路線在您感興趣的路線之前匹配。它是您的管理區域的默認路線/ Admin/{controller/{action/{id}}。如果你打算使用區域,我建議你將你的路由從RouteConfig.cs移動到你所在區域的配置文件。它將位於Areas \ Admin \ AdminAreaRegistration.cs文件中的RegisterArea方法中,您希望所有管理路由都可以進入。並且它需要在默認路由之前。 – Mo09890

+0

是的,這是正確的,我有'AdminAreaRegistration.cs'中的區域的默認路線:) – VSB