ASP.Net MVC - HTTP状态代码(即303,401,404等)

时间:2009-12-30 06:56:30

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

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

我正在通过一本名为“ASP.NET MVC 1.0网站编程”的书,并且来源正在调用诸如return this.Redirect(303, FormsAuthentication.DefaultUrl);这样的调用,但这个调用只能用于外部库,我想拥有如果可能的话,相同的功能没有附加组件。

4 个答案:

答案 0 :(得分:4)

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

我发现this quick write-up您应该能够轻松跟进。

答案 1 :(得分:4)

以下是我根据当前答案中提供的建议和反编译的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);
    }
}

答案 2 :(得分:1)

关于这个的两种方法 -

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

-OR -

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

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

答案 3 :(得分:0)

您也可以使用自定义ActionFilter来完成它,就像我提到here一样。我喜欢ActionFilter,更多的是ActionResult。