首页 > 解决方案 > 调用控制器方法时出现 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 设置正确。这段代码有什么意义吗?

标签: asp.netasp.net-mvcasp.net-core

解决方案


状态码 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>

推荐阅读