C# MVC控制器参数名变更引发行为异常问题咨询
问题原因及解决方法
这是ASP.NET MVC的路由参数绑定规则在起作用,核心点在于默认路由模板的占位符和方法参数名的匹配关系:
默认路由配置(一般在项目的路由配置文件里)的模板类似这样:
routes.MapRoute( name: "Default", url: "{controller}/{action}/{id}", defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } );这里的
{id}是路由里的占位符,当你访问https://localhost:7180/Players/Search/1时,URL最后一段的1会被匹配到这个{id}占位符上。MVC的参数绑定系统会自动把路由占位符的值,绑定到和占位符同名的方法参数上。所以参数名是
id时能正确拿到1;改成thing或name后,系统找不到对应占位符的参数,对于值类型int就会用默认值0填充。
解决办法
有两种常用方式可以解决这个问题:
方式一:用特性显式指定路由占位符
给参数加上[FromRoute]特性,明确告诉系统要从路由的id占位符取值,不管参数叫什么名字:
public string Search([FromRoute(Name = "id")] int thing) { return $"The thing was {thing}"; }
方式二:给Action配置自定义特性路由
直接给Search方法单独定义路由模板,让占位符和你的参数名一致:
[Route("Players/Search/{thing}")] public string Search(int thing) { return $"The thing was {thing}"; }
这样访问原URL时,thing就能正确获取到1了。
内容的提问来源于stack exchange,提问作者emmagras
相关产品推荐
相关产品推荐

