2009-12-30 16 views
6

En ASP.Net MVC, ¿es posible utilizar Redirect o RedirectToAction para llamar, por ejemplo, un error 303?ASP.Net MVC - Códigos de estado HTTP (es decir, 303, 401, 404, etc.)

Estoy trabajando en mi camino a través de un libro titulado "ASP.NET MVC 1.0 Website Programming" y la fuente está haciendo llamadas como return this.Redirect(303, FormsAuthentication.DefaultUrl); pero esta llamada solo funciona con una biblioteca externa, me gustaría tener la misma funcionalidad sin el complemento si es posible.

Respuesta

4

Puede crear ActionResults personalizados que imiten cualquier código de respuesta http que desee. Al devolver esos resultados de acción, puede realizar fácilmente un 303.

Encontré this quick write-up que debe poder seguir fácilmente.

+0

Muchas gracias! También encontré este artículo en el sitio de Phil Haack en caso de que alguien se tope con esto en el futuro: http://haacked.com/archive/2008/12/15/redirect-routes-and-other-fun-with-routing-and -lambdas.aspx – mynameiscoffey

+0

john-sheehan.com El enlace en respuesta ahora va a una página de Tumblr que requiere un inicio de sesión. Original se puede encontrar aquí: http://johnsheehan.me/blog/another-asp-net-mvc-custom-actionresult-example/ –

+0

Ahora johnsheehan.me no se está resolviendo, y el enlace john-sheehan.com es 404. Editado para tener la página archive.org. Esta es la razón por la que siempre es mejor para SO proporcionar respuestas incrustadas/citadas y no solo enlaces. – gregmac

0

También podría lograrlo con un ActionFilter personalizado como menciono here. Por mi parte, me gusta el ActionFilter un poco más el ActionResult.

1

2 maneras sobre esto-

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

-o-

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

Tenga en cuenta que en la primera redirección, que el parámetro falsa evita la excepción ThreadAbort que la redirección (url) lanza normalmente. Esta es una buena razón para usar uno de estos 2 métodos.

3

Esto es lo que ocurrió con base en las indicaciones dadas en las respuestas actuales y la System.Web.Mvc.RedirectResult código descompilada:

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); 
    } 
} 
Cuestiones relacionadas