首先,我是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)
答案 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
);