2009-12-30 2 views
6

In ASP.Net MVC è possibile utilizzare Redirect o RedirectToAction per chiamare ad esempio un errore 303?ASP.Net MVC - Codici di stato HTTP (ad esempio 303, 401, 404, ecc.)

Sto lavorando a un libro intitolato "Programmazione sito Web ASP.NET MVC 1.0" e la sorgente sta effettuando chiamate come return this.Redirect(303, FormsAuthentication.DefaultUrl); ma questa chiamata funziona solo con una libreria esterna, vorrei avere la stessa funzionalità senza il componente aggiuntivo, se possibile.

risposta

4

È possibile creare ActionResults personalizzati che imitano qualsiasi codice di risposta http desiderato. Restituendo tali risultati, è possibile eseguire facilmente un 303.

Ho trovato this quick write-up che dovresti essere in grado di seguire facilmente.

+0

Grazie mille! Ho anche trovato questo articolo sul sito di Phil Haack nel caso in cui qualcuno si imbattesse in questo in futuro: http://haacked.com/archive/2008/12/15/redirect-routes-and-other-fun-with-routing-and -lambdas.aspx – mynameiscoffey

+0

john-sheehan.com link in risposta ora va a una pagina Tumblr che richiede un login. L'originale può essere trovato qui: http://johnsheehan.me/blog/another-asp-net-mvc-custom-actionresult-example/ –

+0

Ora johnsheehan.me non si sta risolvendo e il collegamento john-sheehan.com è 404. Modificato per avere la pagina archive.org. Questo è il motivo per cui è sempre meglio su SO fornire risposte incorporate/citate e non solo collegamenti. – gregmac

0

Si potrebbe anche realizzare con un ActionFilter personalizzato come menziono here. Io per uno come il ActionFilter un po 'di più l'ActionResult.

1

2 modi su di questo-

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

oppure

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

Si noti che nel primo redirect, che il parametro falso evita l'eccezione threadAbort che il reindirizzamento (URL) getta normalmente. Questa è una buona ragione per usare uno di questi 2 metodi.

3

Ecco cosa mi è venuta in base al parere espresso nelle risposte attuali e al codice decompilato 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); 
    } 
}