Asp 随机地址上的 Net Core 2.2 转到控制器而不是 404 Not Found

Asp Net Core 2.2 on random address goes to controller instead of 404 Not Found

如果地址格式正确,一切都很好。 但是当我在地址栏中输入随机字符串时,asp net core 路由到同一个控制器,特别是 Index(model)

   [HttpGet]
   public IActionResult Index() { ... }

   [HttpGet({model})]
   public IActionResult Index(ViewModel model) { ... }

而不是返回 404 Not found。 控制器有问题吗?

您的 HomeController 被映射到 "" 或空路线,然后这第二个 Index 操作基本上需要任何路线部分。因此,/foobar 从字面上路由到此 Index 操作。

这里有很多 problems/misunderstandings。当您在路由中指定 {model} 时,您是在告诉框架这是一个路由参数。实际上没有办法真正绑定您的模型,因为您实际上无法 post 在路由路径中表示 ViewModel

其次, 路由期间没有对路由参数进行验证。换句话说,ASP.NET 核心不看你的动作,看到它需要是 ViewModel 的实例,意识到 /foobar 中的 foobar 不是 ViewModel 然后是 returns 404. 它只是看到在该路段中有一条潜在的路线需要 something,然后尝试加载相应的动作。在模型绑定阶段,事情会失败,但那是在路由已经完成之后。

您可以使用路由约束来添加一层验证。例如,{foo:int} 仅在该路由段中的值是可以转换为 int 的值时才会匹配,但对于 ViewModel.

这样的值,您不能真正做到这一点

第三,您不应该通过 GET 发送整个模型。 GET 没有主体,复杂的对象应该放在请求的主体中。您应该在此处使用 POST。

长短不一,把你的动作改成:

[HttpPost]
public IActionResult Index(ViewModel model) { ... }

你会没事的。