【问题标题】:MVC Route Parameters Are NullMVC 路由参数为空
【发布时间】:2016-07-05 19:28:23
【问题描述】:

我收到以下错误,我的默认路由参数为空。我在 URL 中没有任何参数的控制器操作上使用了相同的代码,并且运行良好。我知道正在调用我的自定义路由,但我不明白为什么 startIndex 和 pageSize 在操作中显示为 null。

错误:

参数字典包含“AEO. WorkOrder.WebUI.Controllers.VendorComplianceController'。可选参数必须是引用类型、可空类型或声明为可选参数。

参数名称:参数

控制器:

public ActionResult ViewVcByStatus(string status, int startIndex, int pageSize) { ... }

路线:

routes.MapRoute("ViewVcByStatus", "ViewVcByStatus/{status}",
  new
  {
    controller = "VendorCompliance",
    action = "ViewVcByStatus",
    startIndex = 0,
    pageSize = WebConfigurationManager.AppSettings["PageSize"],
   });

链接:

<a href="VendorCompliance/ViewVcByStatus?status=PROCESSED">

也试过这个产生同样错误的链接:

<a href="VendorCompliance/ViewVcByStatus/PROCESSED">

【问题讨论】:

  • 您还有其他可能匹配的路线吗?此外,该网址与您在此处显示的路线不匹配。
  • 唯一的其他路由是默认路由。我也尝试了 并收到了相同的结果。

标签: c# asp.net asp.net-mvc


【解决方案1】:

试试这个。

public ActionResult ViewVcByStatus(string status, int? pageSize, int?startIndex)
    {
        return View();
    }

Route.config

routes.MapRoute(
            name: "ViewVcByStatus",
            url: "ViewVcByStatus/{status}",
            defaults: new { controller = "VendorCompliance", action = "ViewVcByStatus", startIndex = UrlParameter.Optional, pageSize = UrlParameter.Optional });

可选参数应该在 routeconfig 中声明为可选并将它们标记为 int?在您的操作方法中,这将为您完成工作。希望这会有所帮助。此解决方案适用于您的问题“http://localhost:53290/VendorCompliance/ViewVcByStatus?status=PROCESSED”中的 url 模式。

【讨论】:

  • 这是将参数标记为可空以避免任何空输入错误的最佳实践。如果你想用 url 传递它们,你可以 VendorCompliance/ViewVcByStatus?status=PROCESSED&startIndex=10&pageSize=1。此外,您还可以为参数分配默认值。方法有很多,主要看你的需求。希望我能坐飞机。
  • 路由部分完全正确,我应该指出这一点但错过了。刚刚注意到您也将 ActionResult 编辑为正确的:)
  • 是的,你是对的。我已经编辑了我的操作结果以避免不必要的混淆。 :)
  • 这是不正确的。路由定义中不能有 2 个参数标记为 UrlParameter.Optional。只有最后一个可以是可选的。
  • 感谢评论,我不认为只允许一个可选参数。您可以有多个可选参数。此外,它工作正常。我已经测试过了。如果你有任何证据,请分享。还要检查这里的链接tutlane.com/tutorial/aspnet-mvc/…
【解决方案2】:

使用链接发送 startIndex 和 pageSize(我对其进行了硬编码,改为使用参数),您的操作结果需要链接需要提供的所有参数,并且 MapRoute 可能会落入默认路由,因为它无法匹配它与您提供的一个参数匹配的任何其他路线

<a href="VendorCompliance/ViewVcByStatus?status=PROCESSED&startIndex=0&pageSize=0">

【讨论】:

  • 这行得通。在路由本身中指定默认参数以避免在链接中指定它们不是重点吗?
  • 恰恰相反。您创建一个自定义路由,以便您可以找到绕过 MVC 的默认行为的方法。但是不要轻易使用 Route,当大多数其他方法都失败时,它们可以作为更难的情况的一种方式。通过在逻辑和脚本中使用控制器或在视图中使用剃刀(例如)可能性,尽可能多地尝试使用正常的 MVC 模式。这也将使其他开发人员更容易阅读代码。许多人不了解自定义路由。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-11
  • 1970-01-01
相关资源
最近更新 更多