asp.net core razor 页面支持删除和放置请求

Har*_*han 3 c# .net-core asp.net-core

最近,我阅读了有关在 asp.net core razor 页面中处理请求的内容,它说它支持head使用约定的请求:

public void OnHead()
{
}
Run Code Online (Sandbox Code Playgroud)

它工作得很好。然后我也尝试使用相同的约定删除。

public void OnDelete()
{
}
Run Code Online (Sandbox Code Playgroud)

但是当我使用邮递员发送删除请求时,它返回一个错误的请求 (500)。我不确定是否需要提供额外的配置来使用删除请求。任何人都可以帮助我。

Chr*_*att 7

没有OnDelete/ OnPut。这是因为 Razor 页面直接面向 Web 视图,即在浏览器选项卡/窗口中显示的页面。浏览器中没有发送 DELETE/PUT 请求的本机方式,因此没有理由支持它们。相反,此类任务是通过 HTML 表单元素处理的,该元素将通过 POST 发送。因此,您将使用OnPost()它来处理它。

文档建议创建一个新的 Razor Page 用于删除,它有自己的方法OnGetOnPost方法,专门用于处理删除。或者,您可以简单地以OnPost[Something]. 对于删除,可能是OnPostDelete,而对于更新,您可能有OnPostUpdate. 名称无关紧要,只是您需要将其作为以下内容传递handler

<form asp-page="Foo" asp-handler="Delete">
Run Code Online (Sandbox Code Playgroud)

如果您需要通过瘦客户端(HttpClient、AJAX、Postman 等)进行交互,那么您应该完全避免使用 Razor Pages 并坚持使用完全支持所有 HTTP 动词的传统控制器。


hal*_*ldo 6

假设您有这样的标记:

<button type="submit" asp-page-handler="delete" 
        asp-route-id="@contact.Id">delete</button>
Run Code Online (Sandbox Code Playgroud)

正确的删除方法是OnPostDelete(或OnPostDeleteAsync)。

所以,可以更新为:

public void OnPostDelete(int id)
{
}
Run Code Online (Sandbox Code Playgroud)

文档说明:

按照惯例,根据scheme根据handler参数的值选择handler方法的名字 OnPost[handler]Async

此外,Async后缀是可选的:

Async命名后缀是可选的,但往往是异步函数使用的约定。