2009-12-30 104 views
6

在ASP.Net MVC中,是否可以使用RedirectRedirectToAction来调用例如303错误?ASP.Net MVC - HTTP状态代码(即303,401,404等)

我正在通过一本名为“ASP.NET MVC 1.0网站编程”的书,源代码正在调用如return this.Redirect(303, FormsAuthentication.DefaultUrl);这样的调用,但这个调用只与外部库函数有关,我希望具有相同的功能sans如果可能的话,附加组件。

回答

4

您可以创建自定义的ActionResults,以模拟任何您想要的http响应代码。通过返回这些行动结果,您可以轻松地执行一个303.

我发现this quick write-up,您应该能够轻松关注。

+0

太谢谢你了!我还在Phil Haack的网站上发现了这篇文章,以防将来有人发现这一点:http://haacked.com/archive/2008/12/15/redirect-routes-and-other-fun-with-routing-and -lambdas.aspx – mynameiscoffey 2009-12-30 08:13:05

+0

john-sheehan.com链接现在回到需要登录的Tumblr页面。原始可以在这里找到:http://johnsheehan.me/blog/another-asp-net-mvc-custom-actionresult-example/ – 2012-07-04 18:35:32

+0

现在johnsheehan.me不解决,john-sheehan.com链接是404。编辑有archive.org页面。这就是为什么提供嵌入/引用答案而不仅仅是链接的原因。 – gregmac 2015-04-29 19:16:58

0

你也可以使用自定义ActionFilter来完成它,比如我提到的here。我对ActionFilter更像ActionResult。

1

2板上钉钉这个 -

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

- 或 -

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

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

3

这就是我想出了基于当前的答案和反编译代码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); 
    } 
}