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



如果地址格式正确,一切都很好。 但是当我在地址栏中输入随机字符串时,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) { ... }

你会没事的。

最新更新