【问题标题】:ASP.NET MVC: parameter is not passed during URL routingASP.NET MVC:在 URL 路由期间未传递参数
【发布时间】:2016-05-30 19:01:29
【问题描述】:

我定义了以下路线以在我的RouteConfig.cs 中包含友好的网址:

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 可以正常工作并按预期传递参数。

附: Admin 是我的应用程序中的一个定义区域。 这是http://localhost:46813/Admin/MaterialPaymentRequestSbuItem/CreateChild?parentId=2 的路由调试器的输出:

【问题讨论】:

  • 您显示的代码工作正常。你是如何生成网址的?
  • @StephenMuecke 我手动生成了上面的 URL 来测试应用程序,但是还有其他测试方法吗?我尝试了 RedirectToAction 和类似的东西,它将以这种模式(.../CreateChild?parentId=32)创建 URL,例如:@Html.ActionLink("Create New Item", "CreateChild", new { parentId = @ViewBag.ParentID }, null)
  • 它必须是 @Html.ActionLink("Create New Item", "CreateChild", "MaterialPaymentRequestSbuItem", new { parentId = @ViewBag.ParentID }, null) 才能正常工作并生成 ..../Admin/MaterialPaymentRequestSbuItem/CreateChild/23。如果不是,那么您还没有向我们展示导致问题的其他原因。
  • @StephenMuecke 这是从同一控制器的索引视图带来的,因此不需要添加控制器名称,但是我尝试显式定义控制器,但它没有进行任何更改。
  • 你声称它生成...?parentId=32而不是.../32? (我无法重现)

标签: asp.net-mvc asp.net-mvc-5 url-routing asp.net-mvc-areas


【解决方案1】:

据我所知,您的路由表看起来是正确的,其中有一个错字,但它似乎始终保持一致,所以我猜这不是问题。

与 teo van kot 所说的相反,您总是希望首先从最具体的路线开始,然后将更一般的路线排在最后,因为只会使用第一个匹配的路线。

我用来调试路由的一个有用工具是来自 Phil Haak 的 Route Debugger。它可以让您查看选择了哪些路由,更有用的是映射了哪些参数,并且可以通过NuGet 安装

【讨论】:

  • 我放了路由调试的输出,对你有帮助吗?
  • 您有另一条路线匹配您感兴趣的路线。这是您管理区域的默认路线,/Admin/{controller/{action/{id}。如果您要使用区域,我建议您将路线从 RouteConfig.cs 移动到您所在区域的配置文件中。它将位于 Areas\Admin\AdminAreaRegistration.cs 文件中的 RegisterArea 方法中,您希望所有的管理路由都进入。同样,它需要位于默认路由之前。
  • 是的,没错,我在AdminAreaRegistration.cs 有一个区域的默认路线:)
  • 太棒了,只需将您的路线移到那里,它应该可以按您的意愿工作!如果现在可行,我将不胜感激您将此标记为答案:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多