ASP.NET MVC路由异常:localhost:50675/test/101访问报错
问题分析与解决方案
你遇到的这个异常,核心原因是路由定义的URL参数名和Action方法的参数名不匹配,导致MVC无法正确将URL中的值绑定到Action的参数上,具体来说:
你的自定义路由里,URL模板是{controller}/{id},但你在默认值里指定的是custid = UrlParameter.Optional,同时Action方法的参数是int custid。当你访问localhost:50675/test/101时,路由系统会把URL中的101识别为id参数的值,但你的Action并没有id参数,只有custid,所以就会出现参数字典中custid为null的异常(而int是非可空类型,自然报错)。
而localhost:50675/test?custid=101能正常访问,是因为这种方式是通过查询字符串传递参数,MVC会直接根据参数名称进行匹配,不需要依赖路由模板里的参数定义,所以能正确绑定到custid。
下面给你两种可行的解决方法:
方法一:修改路由模板的参数名,与Action参数一致
把自定义路由的URL模板里的{id}改成{custid},这样URL中的值就能直接绑定到Action的custid参数上:
routes.MapRoute( name: "custom1", url: "{controller}/{custid}", // 将{id}替换为{custid} defaults: new { controller = "Test", action = "Index", custid = UrlParameter.Optional } );
方法二:修改Action的参数名,与路由模板参数一致
如果你不想修改路由,可以把Action方法的custid参数改成id,这样路由里的{id}就能正确绑定:
public class TestController : Controller { // GET: Test public ActionResult Index(int id) { // 将custid改为id return View(); } }
两种方法任选其一即可,修改后再访问localhost:50675/test/101就能正常进入Action方法了。另外要注意路由的顺序,你的自定义路由已经放在默认路由前面,这是正确的,因为MVC会按顺序匹配路由规则。
内容的提问来源于stack exchange,提问作者Mist
相关产品推荐
相关产品推荐

