【问题标题】:Incorrect routing with optional parameter带有可选参数的错误路由
【发布时间】:2013-12-07 14:41:16
【问题描述】:

我想扩展一个控制器动作来接受一个可选参数。换句话说,我希望现有代码继续工作,但添加一些可以传递额外信息的新功能。我修改了我的路由提供程序、控制器并对其进行了测试。可选参数和路由都很好用。所以我做了一个回归测试,看看现有的代码仍然可以工作,你猜对了。没有。

那么我做错了什么/不理解?我认为我可以使用现有的控制器操作,它可以在有或没有可选参数的情况下工作吗?

我没有发布我的控制器代码,因为我不相信它会起作用。我在第一行设置了断点,但从未到达那里,所以在我看来,我的 routeprovider 有错误。如果需要其他代码,我很乐意添加。

这可行:domain.com/signup/12345

这不是,但过去可以正常工作:domain.com/signup

routes.MapLocalizedRoute("SignUp", "signup/{CampaignId}",
new {controller="Customer", action="NewSignup", CampaignId=UrlParameter.Optional},
new { CampaignId = @"\d+" },
new[] { "Domain.PROJECT.Controllers" });

所以我希望上面的两个 url 示例能够正常工作。我当然可以添加另一条不带活动 ID 的路由并将其指向相同的控制器操作,但再次......我认为......这就是使活动 ID 可选的想法???

新的 { CampaignId = @"\d+" }, 对象约束是否会覆盖可选参数并基本上强制campaignid 存在?

谢谢

【问题讨论】:

  • new { CampaignId = @"\d*" } 应该这样做。
  • @shakib 这并没有破坏任何东西,但它不允许路由在有/没有参数的情况下运行。
  • 可能我理解错了,但是使用默认路由处理程序即MvcRouteHandler,使用约束new { CampaignId = @"\d*" }支持site.com/signupsite.com/signup/site.com/signup/123

标签: asp.net-mvc asp.net-mvc-3 asp.net-mvc-routing


【解决方案1】:

只需定义两条路线。

需要campaingId的人:

routes.MapLocalizedRoute("SignUpCampaign", "signup/{CampaignId}",
                         new { controller="Customer", action="NewSignup" },
                         new { CampaignId = @"\d+" },
                         new[] { "Domain.PROJECT.Controllers" });

还有一个不需要它:

routes.MapLocalizedRoute("SignUp", "signup",
                         new { controller="Customer", action="NewSignup" },
                         null,
                         new[] { "Domain.PROJECT.Controllers" });

【讨论】:

  • 我同意这可行,但那是创可贴吗?看到我不知道,所以我不是在质疑你只是想理解。
  • 如果你有一个可选参数并且对该参数有一个约束,我不确定路由是否匹配。一点点研究表明它永远不会匹配:stackoverflow.com/questions/3468115/…
猜你喜欢
  • 2023-03-03
  • 2016-10-12
  • 2011-01-09
  • 2013-09-10
  • 1970-01-01
  • 2016-08-01
  • 2018-04-06
  • 1970-01-01
相关资源
最近更新 更多