为何ASP.NET Core 6中POST请求可匹配默认GET的Index方法?
为什么POST请求能触发未标注[HttpGet]的Index方法?
核心原因是:ASP.NET Core中,没有标注[HttpGet]、[HttpPost]等HTTP动词特性的控制器方法,默认允许接收所有类型的HTTP请求(包括GET、POST、PUT等),并非你误以为的“默认只对应GET请求”。
关键细节拆解:
- 控制器方法上的
[HttpXXX]特性是用来限定该方法能接收的HTTP动词,如果不添加任何这类特性,方法的请求匹配规则是无限制的——只要路由路径匹配(这里是Movies/Index),不管客户端发的是GET还是POST,都会触发这个方法。 - 你看到的代码注释
// GET: Movies只是开发者的说明性备注,完全不影响方法的实际请求匹配逻辑。
对应你的场景:
- 表单未指定
method属性,默认发送POST请求,目标路由为Movies/Index - 你的
Index方法没有任何[HttpXXX]特性,所以会接收这个POST请求,同时ASP.NET Core的模型绑定会自动从POST表单数据中提取searchText参数(不管是GET的查询字符串还是POST的表单数据,模型绑定都能处理) - 教程里说“无需添加[HttpPost]重载”,正是因为这个方法本身就支持POST请求,不需要额外写重载版本。而且因为这个操作只是查询过滤数据、不修改应用状态,用GET更符合REST规范,但表单默认POST也能正常工作,因为方法没有限制请求动词。
内容的提问来源于stack exchange,提问作者Tony Chen
相关产品推荐
相关产品推荐

