2009-12-30 7 views
6

In ASP.Net MVC ist es möglich, entweder Redirect oder RedirectToAction zu verwenden, um zum Beispiel einen Fehler 303 aufzurufen?ASP.Net MVC - HTTP-Statuscodes (d. H. 303, 401, 404 usw.)

arbeite ich mich durch ein Buch mit dem Titel „ASP.NET MVC 1.0 Website-Programmierung“ und die Quelle macht Anrufe wie return this.Redirect(303, FormsAuthentication.DefaultUrl); aber dieser Aufruf nur mit einer externen Bibliotheksfunktionen, würde Ich mag die gleiche Funktionalität sans hat das Add-on wenn möglich.

Antwort

4

Sie können benutzerdefinierte ActionResults erstellen, die einen beliebigen HTTP-Antwortcode nachahmen. Durch das Zurücksenden dieser Aktionsergebnisse können Sie leicht eine 303.

Ich fand this quick write-up, dass Sie in der Lage sein, leicht zu folgen.

+0

Vielen Dank! Ich habe diesen Artikel auch auf Phil Haacks Seite gefunden, falls jemand in Zukunft darüber stolpert: http://haacked.com/archive/2008/12/15/redirect-routes-and-other-fun-with-routing-and -lambdas.aspx – mynameiscoffey

+0

john-sheehan.com Link in der Antwort geht jetzt auf eine Tumblr-Seite, die eine Anmeldung erfordert. Original kann hier gefunden werden: http://johnsheehan.me/blog/another-asp-net-mvc-custom-actionresult-example/ –

+0

Jetzt johnsheehan.me ist nicht auflösend, und der john-sheehan.com Link ist 404. Bearbeitet, um die archive.org Seite zu haben. Aus diesem Grund ist es bei SO immer besser, eingebettete/zitierte Antworten und nicht nur Links bereitzustellen. – gregmac

0

Sie könnten es auch mit einem benutzerdefinierten ActionFilter erreichen, wie ich here erwähne. Ich für den einen wie den ActionFilter ein bisschen mehr das ActionResult.

1

2 Möglichkeiten, um über this-

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

-oder

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

Beachten Sie, dass in der ersten Umleitung, dass der falsche Parameter, um die Threadabort Ausnahme vermeidet, dass die Umleitung (url) normalerweise wirft. Dies ist ein guter Grund, eine dieser beiden Methoden zu verwenden.

3

Hier ist, was ich mit auf der Grundlage der Beratung in den aktuellen Antworten und der dekompilierten System.Web.Mvc.RedirectResult Code gegeben kam:

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); 
    } 
} 
Verwandte Themen