ASP.NET Core MVC中FormMethod.Get结合Html.BeginForm报HTTP 405错误
问题解决指南
先搞定405错误:请求方法不匹配是核心
你控制器方法标了[HttpPost],但表单用的是FormMethod.Get,这俩完全不搭,服务器直接返回405(方法不允许)。得按需求选一种:
- 推荐:用Get做搜索(符合搜索功能的常规设计,用户能收藏、分享搜索链接):
- 把控制器上的
[HttpPost]和[ValidateAntiForgeryToken]全删掉,要么换成[HttpGet],要么啥也不标(默认就是Get)。 - 表单保留
FormMethod.Get,同时删掉视图里的@Html.AntiForgeryToken()——防伪造令牌是给Post/Put这类修改数据的请求用的,Get请求根本不需要。
- 把控制器上的
- 非要用Post的话(不推荐):
- 把表单的
FormMethod.Get改成FormMethod.Post。 - 立刻删掉嵌套的
<form>标签!HTML不允许表单嵌套,这会导致浏览器解析混乱,不仅生成重复令牌,还会让表单行为异常。
- 把表单的
干掉重复的__RequestVerificationToken
- 别手动加
@Html.AntiForgeryToken():如果用Post,Html.BeginForm配合控制器的[ValidateAntiForgeryToken]会自动生成令牌,手动加就会重复。 - 彻底清理嵌套表单:只要页面里有嵌套的
<form>,就肯定出问题,必须保证每个表单都是独立的,没有层级嵌套。
给你个正确的Get搜索示例:
控制器代码
public IActionResult Search(string searchQuery) { // 这里写你的搜索逻辑 return View(); }
视图代码
@using (Html.BeginForm("Search", "YourControllerName", FormMethod.Get)) { <input type="text" name="searchQuery" placeholder="输入关键词" /> <button type="submit">搜索</button> }
这样改完,405错误和重复令牌的问题都能解决。
内容的提问来源于stack exchange,提问作者ZNAXNOR
相关产品推荐
相关产品推荐

