在MVC 3中,是否可以确定某个操作是POST或GET方法的结果?我知道你可以使用[HttpPost]和[HttpGet]来装饰动作,以便在其中一个发生时触发特定动作。我想做的是关闭这些属性并以编程方式确定导致该操作的属性。
原因是,由于我的搜索页面的架构方式,我将搜索模型存储在TempData中。初始搜索会导致POST到搜索结果页面,但是分页链接都只是指向“/ results / 2”的链接(第2页)。他们检查TempData以查看模型是否在那里使用它。如果是这样的话。
如果有人使用后退按钮转到搜索表单并重新提交,则会导致问题。它仍在使用TempData中的模型,而不是使用新的搜索条件。所以,如果它是一个POST(即刚刚提交了搜索表单的人),我想首先清除TempData。
答案 0 :(得分:75)
HttpRequest
对象上的HttpMethod
属性将为您提供。你可以使用:
if (HttpContext.Current.Request.HttpMethod == "POST")
{
// The action is a POST.
}
或者您可以直接从当前控制器获取Request
对象。这只是一个属性。
答案 1 :(得分:3)
最好将其与HttpMethod
属性而不是字符串进行比较。
HttpMethod在以下命名空间中可用:
using System.Net.Http;
if (HttpContext.Request.HttpMethod == HttpMethod.Post.Method)
{
// The action is a post
}
答案 2 :(得分:3)
从 .Net Core 3 开始,您可以使用 HttpMethods.Is{Verb}
,如下所示:
using Microsoft.AspNetCore.Http
HttpMethods.IsPost(context.Request.Method);
HttpMethods.IsPut(context.Request.Method);
HttpMethods.IsDelete(context.Request.Method);
HttpMethods.IsPatch(context.Request.Method);
HttpMethods.IsGet(context.Request.Method);
您甚至可以更进一步,创建您的自定义扩展来检查它是读操作还是写操作,如下所示:
public static bool IsWriteOperation(this HttpRequest request) =>
HttpMethods.IsPost(request?.Method) ||
HttpMethods.IsPut(request?.Method) ||
HttpMethods.IsPatch(request?.Method) ||
HttpMethods.IsDelete(request?.Method);
答案 3 :(得分:1)
如果您像我一样,不想使用字符串文字(使用DI的.net core 2.2中间件):
public async Task InvokeAsync(HttpContext context)
{
if (context.Request.Method.Equals(HttpMethods.Get, StringComparison.OrdinalIgnoreCase))
{
…
}
}
答案 4 :(得分:0)
要在ASP.NET Core中检测到这一点:
if (Request.Method == "POST") {
// The action is a POST
}