如果地址格式正确,一切都很好。 但是当我在地址栏中输入随机字符串时,asp 网络核心路由到同一个控制器,特别是索引(模型(
[HttpGet]
public IActionResult Index() { ... }
[HttpGet({model})]
public IActionResult Index(ViewModel model) { ... }
而不是返回 404 未找到。 控制器有问题吗?
您的HomeController
映射到"或空路由,然后第二个Index
操作基本上需要任何路由部分。因此,/foobar
从字面上路由到这个Index
操作。
这里有许多问题/误解。在路由中指定{model}
时,您告诉框架这是一个路由参数。实际上,无法实际绑定模型,因为实际上无法在路由路径中发布ViewModel
的表示形式。
其次,在路由期间没有对路由参数进行验证。换句话说,ASP.NET Core 不会看你的动作,看到它需要是ViewModel
的实例,意识到/foobar
中的foobar
不是ViewModel
然后返回 404。它只是看到有一个潜在的路由在该路由段中获取某些内容,然后尝试加载相应的操作。它处于模型绑定阶段,事情会失败,但这是在路由已经完成之后。
您可以使用路由约束来添加验证层。例如,仅当该路由段中的值是可以转换为 int 的值时,{foo:int}
才会匹配,但对于ViewModel
之类的东西,您实际上无法这样做。
第三,您不应该通过GET发送整个模型。GET 没有正文,复杂对象应该放在请求的正文中。您应该在此处使用 POST。
长短,将您的操作更改为:
[HttpPost]
public IActionResult Index(ViewModel model) { ... }
你会没事的。