2016-05-30 196 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