mynameiscoffey
mynameiscoffey

Reputation: 15982

ASP.Net MVC - HTTP Status Codes (i.e. 303, 401, 404, etc)

In ASP.Net MVC is it possible to use either Redirect or RedirectToAction to call for example a 303 error?

I am working my way through a book titled "ASP.NET MVC 1.0 Website Programming" and the source is making calls such as return this.Redirect(303, FormsAuthentication.DefaultUrl); but this call only functions with an external library, I would like to have the same functionality sans the add-on if possible.

Upvotes: 6

Views: 7482

Answers (4)

womp
womp

Reputation: 116977

You can create custom ActionResults that mimic any http response code you'd like. By returning those action results, you can easily perform a 303.

I found this quick write-up that you should be able to follow easily.

Upvotes: 4

Ohad Schneider
Ohad Schneider

Reputation: 38112

Here's what I came up with based on the advice given in the current answers and the decompiled System.Web.Mvc.RedirectResult code:

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

Upvotes: 4

Westley
Westley

Reputation: 61

2 ways about this-

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

-or-

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

Note that in the first redirect, that the false parameter avoids the threadAbort exception that the redirect(url) normally throws. This is one good reason to use one of these 2 methods.

Upvotes: 3

DM.
DM.

Reputation: 1847

You could also accomplish it with a custom ActionFilter like I mention here. I for one like the ActionFilter a bit more the the ActionResult.

Upvotes: 0

Related Questions