【问题标题】:Detect if action is a POST or GET method检测动作是 POST 还是 GET 方法
【发布时间】:2011-05-06 16:58:16
【问题描述】:

在 MVC 3 中,是否可以确定操作是 POST 还是 GET 方法的结果?我知道你可以用 [HttpPost] 和 [HttpGet] 来装饰动作,以在其中一个发生时触发特定动作。我想做的是关闭这些属性并以编程方式确定是哪一个导致了操作。

原因是,由于我的搜索页面的架构方式,我将搜索模型存储在 TempData 中。初始搜索会导致 POST 到搜索结果页面,但分页链接都只是指向“/results/2”的链接(对于第 2 页)。他们检查 TempData 以查看模型是否在其中,如果有则使用它。

当有人使用后退按钮转到搜索表单并重新提交时,这会导致问题。它仍在使用 TempData 中的模型,而不是使用新的搜索条件。因此,如果是 POST(即有人刚刚提交了搜索表单),我想先清除 TempData。

【问题讨论】:

    标签: c# asp.net-mvc


    【解决方案1】:

    HttpRequest 对象上的 HttpMethod 属性将为您获取它。您可以使用:

    if (HttpContext.Current.Request.HttpMethod == "POST")
    {
        // The action is a POST.
    }
    

    或者您可以直接从当前控制器中获取Request 对象。它只是一个属性。

    【讨论】:

    • 对于它的价值,我也偏爱始终使用 GET 请求进行搜索,并将我的所有参数都放在查询字符串中。它使书签、分页和其他问题更容易处理。
    • 感谢您的快速回复。我会这样做,但是搜索表单确实非常复杂,有很多组合框(多项选择等)。超过最大查询字符串长度实际上很容易。
    • 如果要常量,可以使用System.Net.WebRequestMethods.Http集合。
    • 请注意,使用 GET 时缓存相关的错误可能会偷偷摸摸。
    【解决方案2】:

    最好将其与HttpMethod 属性而不是字符串进行比较。 HttpMethod 在以下命名空间中可用:

    using System.Net.Http;
    
    if (HttpContext.Request.HttpMethod == HttpMethod.Post.Method)
     {
     // The action is a post
     }
    

    【讨论】:

      【解决方案3】:

      要在 ASP.NET Core 中检测到这一点:

      if (Request.Method == "POST") {
          // The action is a POST
      }
      

      【讨论】:

        【解决方案4】:

        从 .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);
        

        【讨论】:

          【解决方案5】:

          如果您像我一样不喜欢使用字符串文字(使用 DI 的 .net core 2.2 中间件):

          public async Task InvokeAsync(HttpContext context)
          {
              if (context.Request.Method.Equals(HttpMethods.Get, StringComparison.OrdinalIgnoreCase))
              {
                  …
              }
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2014-01-30
            • 1970-01-01
            • 2018-12-01
            • 2010-11-25
            • 2016-07-03
            • 2011-04-01
            • 1970-01-01
            相关资源
            最近更新 更多