In ASP.NET MVC you can return a redirect ActionResult quite easily :
return RedirectToAction("Index");
or
return RedirectToRoute(new { controller = "home", version = Math.Random() * 10 });
This will actually give an HTTP redirect, which is normally fine. However, when using google analytics this causes big issues because the original referer is lost so google doesnt know where you came from. This loses useful information such as any search engine terms.
As a side note, this method has the advantage of removing any parameters that may have come from campaigns but still allows me to capture them server side. Leaving them in the query string leads to people bookmarking or twitter or blog a link that they shouldn't. I've seen this several times where people have twittered links to our site containing campaign IDs.
Anyway, I am writing a 'gateway' controller for all incoming visits to the site which i may redirect to different places or alternative versions.
For now I care more about Google for now (than accidental bookmarking), and I want to be able to send someone who visits /
to the page that they would get if they went to /home/7
, which is version 7 of a homepage.
Like I said before If I do this I lose the ability for google to analyse the referer :
return RedirectToAction(new { controller = "home", version = 7 });
What i really want is a
return ServerTransferAction(new { controller = "home", version = 7 });
which will get me that view without a client side redirect. I don't think such a thing exists though.
Currently the best thing I can come up with is to duplicate the whole controller logic for HomeController.Index(..)
in my GatewayController.Index
Action. This means I had to move 'Views/Home'
into 'Shared'
so it was accessible. There must be a better way??..