当MVC路由触发时,在控制器中获取空参数值

时间:2011-01-12 16:35:05

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

首先,我是MVC的新手,所以请原谅这个问题是否基本。

我正在使用自定义路线创建以下网址(http://mysite/subscriber/12345),其中12345是订阅者编号。我希望它在ShowAll控制器中运行Subscriber操作。我的路由正在触发并使用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)

3 个答案:

答案 0 :(得分:5)

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

所以,我最终得到的路线是:

  

routes.MapRoute(                 “SubscriberAll”                 “订户/(编号)”,                 new {controller =“Subscriber”,action =“ShowAll”},                 new {id = @“\ d +”} //确认数字               );

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

 public ActionResult ShowAll(string id)

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

而不是在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
                );