【问题标题】:Getting null parameter value in controller when an MVC route fires触发 MVC 路由时在控制器中获取空参数值
【发布时间】:2011-01-12 16:35:05
【问题描述】:

首先,我是 MVC 新手,所以如果是基本问题,请原谅。

我正在使用自定义路由来创建以下 URL (http://mysite/subscriber/12345),其中 12345 是订阅者号码。我希望它在Subscriber 控制器中运行ShowAll 操作。我的路由正在触发并使用Phil's route debugger,当我传入上面的 url 时,路由调试器显示 ID 为 12345。 我的控制器接受一个 int 作为subscriberID。开火的时候, 控制器抛出错误

参数字典包含不可为空类型“System.Int32”的参数“id”的空条目。

为什么路由调试器显示值而控制器看不到?

这是我的路线(第一个是罪魁祸首)

 routes.MapRoute(
              "SubscriberAll",
              "subscriber/{id}",
              new { controller = "Subscriber", action = "ShowAll", id=0 },
              new { id = @"\d+" } //confirm numeric
            );

            routes.MapRoute(
                "Default", // Route name
                "{controller}/{action}/{id}", // URL with parameters
                new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
            );

知道为什么我在ShowAll 操作中得到一个空值吗?这是动作方法签名:

 public ActionResult ShowAll(int id)

【问题讨论】:

  • 你能把所有的路由注册连同动作方法签名一起发布吗?
  • 我认为问题出在你的约束上。我不是正则表达式忍者,所以我无法帮助你。

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


【解决方案1】:

发现控制器方法签名需要接受一个字符串,因为 MVC 不知道传递的参数是什么类型,因此无法将其强制转换为 int,但它可以通过约束强制执行。

所以,我最终的路线是这样的:

routes.MapRoute( "所有订阅者", "订阅者/{id}", 新的{控制器=“订阅者”,动作=“ShowAll”}, new {id = @"\d+" } //确认数字 );

我最终得到的控制器方法签名是这样的

 public ActionResult ShowAll(string id)

【讨论】:

  • 那不准确;实际上,MVC 会尝试将您在 url 中传递的任何字符串解析为 int。使用 public ActionResult ShowAll(string id) + new { controller = "Home", action = "Index", id = UrlParameter.Optional } 应该可以工作,只要 id 参数是 int 类型并称为 id,没有其他类似 personId。
  • @usefulBee:感谢你写了“并且调用了id,没有其他类似personId”,我才意识到我在我的代码中犯了这个错误,现在我觉得自己像一个白痴,但我的问题解决了! :D 谢谢。我认为您应该将其作为单独的答案发布(您至少会得到我的支持)。
  • 天哪,我无意中将参数名称从 id 更改为更具体的名称,这破坏了路由。
【解决方案2】:

尝试从默认列表中删除 id 即只有

new { controller = "Subscriber", action = "ShowAll" }

【讨论】:

    【解决方案3】:

    不要在 MapRoute 中写“id = 0”,而是写“id = UrlParameter.Optional”

    这肯定适用于您的操作结果

    public ActionResult ShowAll(int id)
    
    routes.MapRoute(
                      "SubscriberAll",
                      "subscriber/{id}",
                      new { controller = "Subscriber", action = "ShowAll", id = UrlParameter.Optional },
                      new { id = @"\d+" } //confirm numeric
                    );
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-07-09
      • 1970-01-01
      • 1970-01-01
      • 2018-01-11
      • 1970-01-01
      • 1970-01-01
      • 2016-10-21
      相关资源
      最近更新 更多