【问题标题】:ASP.Net MVC - HTTP Status Codes (i.e. 303, 401, 404, etc)ASP.Net MVC - HTTP 状态代码(即 303、401、404 等)
【发布时间】:2025-12-30 07:50:12
【问题描述】:

在 ASP.Net MVC 中是否可以使用 RedirectRedirectToAction 来调用例如 303 错误?

我正在阅读一本名为“ASP.NET MVC 1.0 网站编程”的书,来源正在拨打诸如 return this.Redirect(303, FormsAuthentication.DefaultUrl); 之类的电话,但此电话仅适用于外部库,我希望具有相同的功能如果可能,不要添加插件。

【问题讨论】:

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


    【解决方案1】:

    解决这个问题的两种方法-

      Response.Redirect(url, false); //status at this point is 302
      Response.StatusCode = 303;
    

    -或-

      Response.RedirectLocation = url;
      Response.StatusCode = 303;
    

    请注意,在第一次重定向中,false 参数避免了 redirect(url) 通常抛出的 threadAbort 异常。这是使用这两种方法之一的一个很好的理由。

    【讨论】:

      【解决方案2】:

      这是我根据当前答案中给出的建议和反编译的System.Web.Mvc.RedirectResult 代码得出的结论:

      public class SeeOtherRedirectResult : ActionResult
      {
          public string Url { get; private set; }
          public HttpStatusCode StatusCode { get; private set; }
      
          public SeeOtherRedirectResult(string url, HttpStatusCode statusCode)
          {
              if (String.IsNullOrEmpty(url))
              {
                  throw new ArgumentException("URL can't be null or empty");
              }
              if ((int) statusCode < 300 || (int) statusCode > 399)
              {
                  throw new ArgumentOutOfRangeException("statusCode", 
                              "Redirection status code must be in the 3xx range");
              }
              Url = url;
              StatusCode = statusCode;
          }
      
          public override void ExecuteResult(ControllerContext context)
          {
              if (context == null)
              {
                  throw new ArgumentNullException("context");
              }
              if (context.IsChildAction)
              {
                  throw new InvalidOperationException("Cannot redirect in child action");
              }
      
              context.Controller.TempData.Keep();
              context.HttpContext.Response.StatusCode = (int) StatusCode;
              context.HttpContext.Response.RedirectLocation =
                           UrlHelper.GenerateContentUrl(Url, context.HttpContext);
          }
      }
      

      【讨论】:

        【解决方案3】:

        您可以创建自定义 ActionResult 来模仿您想要的任何 http 响应代码。通过返回这些操作结果,您可以轻松执行 303。

        我找到了this quick write-up,您应该可以轻松关注。

        【讨论】:

        • 非常感谢!我还在 Phil Haack 的网站上找到了这篇文章,以防将来有人偶然发现:haacked.com/archive/2008/12/15/…
        • john-sheehan.com 回答中的链接现在转到需要登录的 Tumblr 页面。原文可以在这里找到:johnsheehan.me/blog/…
        • 现在 johnsheehan.me 无法解析,john-sheehan.com 链接为 404。已编辑为具有 archive.org 页面。这就是为什么在 SO 上提供嵌入/引用的答案而不仅仅是链接总是更好的原因。
        【解决方案4】:

        您也可以像我提到的here 那样使用自定义 ActionFilter 来完成它。对于ActionFilter,我更喜欢ActionResult。

        【讨论】: