我有一个.NET Core 2.2 Web应用程序。我需要在控制器方法中获取文本框的值,所以我需要以下代码:
<button type="button" onclick="location.href='@Url.Action("Create", "Home")'" />
我的按钮调用控制器方法。
控制器方法如下:
[HttpPost]
public IActionResult SelectCar(FormCollection form)
{
调用此方法时,出现405错误。我的主人告诉我,服务器已设置为允许这样做,并且web.config设置正确。这是什么代码吗?
答案 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>