PermanentRedirectResult – a 301 HTTP Redirect for MVC

For a little project to learn MVC, I needed my Controller to return a HTTP 301 Redirect. Unfortunately, just calling "return Redirect(url)" returns a HTTP 302 instead of a 301. After checking on the MVC Forums, there seems to be no "official" way to perform a 301 Redirect in a Controller. Of course, you can always modify the Response directly, but I decided that returning an ActionResult would be cleaner (and I think that makes it easier to unit test), even though it is essentially doing exactly that, setting a custom Status Code and Redirect Location.

So here is my little PermanentRedirectResult:

public class PermanentRedirectResult : ActionResult
    public string Url { get; set; }

    public PermanentRedirectResult(string url)
        if (string.IsNullOrEmpty(url))
            throw new ArgumentException("url is null or empty", "url");
        this.Url = url;

    public override void ExecuteResult(ControllerContext context)
        if (context == null)
            throw new ArgumentNullException("context");
        context.HttpContext.Response.StatusCode = 301;
        context.HttpContext.Response.RedirectLocation = Url;

Comments (5)

ASP.NET MVC Archived Buzz, Page 1August 6th, 2009 at 21:40

[...] to Vote[FriendFeed] PermanentRedirectResult – a 301 HTTP Redirect for MVC (8/6/2009)Thursday, August 06, 2009 from [...]

Andrei RineaOctober 3rd, 2009 at 23:16

Microsoft introduces PermanentRedirect in ASP.NET 4.0 :

mstumOctober 4th, 2009 at 21:53

Sweet, I hope they add to to MVC 2.0 as well.

[...] to return an ActionResult from the ControllerAction instead. As I happen to have already written a PermanentRedirectResult, my suggestion to improve this code is [...]

David CumpsAugust 13th, 2010 at 21:19

Thanks, just what I needed for my site 🙂