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