asp.net - 调用控制器方法时出现 HTTP 405 错误
问题描述
我有一个 .NET Core 2.2 Web 应用程序。我需要在控制器方法中获取文本框的值,所以我有以下代码:
<button type="button" onclick="location.href='@Url.Action("Create", "Home")'" />
我的按钮调用控制器方法。
控制器方法如下所示:
[HttpPost]
public IActionResult SelectCar(FormCollection form)
{
调用此方法时,我收到 405 错误。我的主机通知我服务器已设置为允许这样做,并且 web.config 设置正确。这段代码有什么意义吗?
解决方案
状态码 405 表示Method Not Allowed,这实际上意味着您正在为不支持此路由的路由使用 HTTP 方法/动词。在您的情况下,该操作是一个 POST 操作 ( [HttpPost]
),因此您需要使用 HTTP POST 方法使其成功。如果您收到该错误,则显然您使用了错误的方法。
原因很简单:您的按钮上有一个点击处理程序。因此,当您单击按钮时,将执行以下代码:
location.href='@Url.Action("Create", "Home")'
该@Url.Action()
部分是 Razor 代码,因此当它向浏览器提供 HTML 时,它将首先在服务器上执行。所以对浏览器来说,会有这样的东西:
location.href='http://localhost:5000/Home/Create'
当您单击该按钮时,一些 JavaScript 代码会将 设置location.href
为该新 URL。这意味着浏览器将导航到该 URL。但是浏览器中的导航通常是 GET 请求。因此,浏览器将向该 URL 发出 GET 请求,您将收到 405 错误,因为它必须是 POST。
对此的解决方案是“视情况而定”。如果你想构建一个标准的 HTML 表单,那么你应该使用标准的 HTML 机制来构建一个表单,然后发布到你的操作。这可以使用 ASP.NET Core表单标签助手来完成:
<form asp-action="Create" asp-controller="Home">
<!-- form contents -->
<button type="submit">Submit</button>
</form>
推荐阅读
- elixir - Ecto.Repo.delete/2:查看类型规范时,如何知道是否存在默认值?
- python - .NET 中使用的 Python Hug REST API,JSON 看起来很奇怪
- html - 在 div 中垂直对齐的各种文本内容
- selenium - 有没有办法找到特定的文本并突出显示它
- reactjs - 错误:permission_denied at /categories:客户端无权访问所需数据
- javascript - eslint 从子文件夹运行时无法解析相对模块路径
- rust - 我无法理解这个 MCVE 中的生命周期问题,灵感来自我的 ODE 求解器代码
- python - 外语测验和计数结果
- java - 如何在二维数组 Java 上仅更改和显示一列(通过用户输入)
- python - Pandas 将数据框值转换为列名