调用控制器方法时出现HTTP 405错误

时间:2019-12-04 22:08:49

标签: asp.net asp.net-mvc asp.net-core

我有一个.NET Core 2.2 Web应用程序。我需要在控制器方法中获取文本框的值,所以我需要以下代码:

<button type="button" onclick="location.href='@Url.Action("Create", "Home")'" />

我的按钮调用控制器方法。

控制器方法如下:

[HttpPost]
public IActionResult SelectCar(FormCollection form)
{

调用此方法时,出现405错误。我的主人告诉我,服务器已设置为允许这样做,并且web.config设置正确。这是什么代码吗?

1 个答案:

答案 0 :(得分:1)

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

<form asp-action="Create" asp-controller="Home">

  <!-- form contents -->

  <button type="submit">Submit</button>
</form>