在ASP.NET MVC中,你可以很容易地返回一个重定向的ActionResult:
return RedirectToAction("Index");
or
return RedirectToRoute(new { controller = "home", version = Math.Random() * 10 });
这实际上会给出一个HTTP重定向,这通常是很好的。然而,当使用Google Analytics时,这会造成很大的问题,因为原始的推荐人丢失了,所以Google不知道你来自哪里。这会丢失有用的信息,例如任何搜索引擎术语。
顺便说一句,这种方法的优点是删除了可能来自活动的任何参数,但仍然允许我捕获它们的服务器端。将它们留在查询字符串中会导致人们添加书签或twitter或博客,这是他们不应该使用的链接,我见过很多次,人们在推特上链接到我们的包含活动ID的网站。
无论如何,我正在编写一个‘网关’控制器,为所有进入网站的访问,我可能会重定向到不同的地方或替代版本。
就目前而言,我更关心谷歌(而不是意外的书签),我希望能够将访问/
的人发送到他们访问/home/7
时会得到的页面,这是主页的版本7。
就像我之前说的,如果我这样做,我就失去了谷歌分析推荐人的能力:
return RedirectToAction(new { controller = "home", version = 7 });
我真正想要的是一个
return ServerTransferAction(new { controller = "home", version = 7 });
这将使我在没有客户端重定向的情况下获得视图。不过,我认为这样的事情并不存在。
目前,我能想到的最好的办法就是在我的GatewayController.Index
操作中复制HomeController.Index(..)
的整个控制器逻辑。这意味着我不得不将'Views/Home'
移到'Shared'
中,这样它就可以访问了。一定有更好的办法。
发布于 2009-05-21 11:50:20
我最近发现ASP.NET MVC不支持Server.Transfer(),所以我创建了一个存根方法(灵感来自Default.aspx.cs)。
private void Transfer(string url)
{
// Create URI builder
var uriBuilder = new UriBuilder(Request.Url.Scheme, Request.Url.Host, Request.Url.Port, Request.ApplicationPath);
// Add destination URI
uriBuilder.Path += url;
// Because UriBuilder escapes URI decode before passing as an argument
string path = Server.UrlDecode(uriBuilder.Uri.PathAndQuery);
// Rewrite path
HttpContext.Current.RewritePath(path, false);
IHttpHandler httpHandler = new MvcHttpHandler();
// Process request
httpHandler.ProcessRequest(HttpContext.Current);
}
发布于 2009-04-28 19:42:17
难道你不能创建一个你想要重定向到的控制器的实例,调用你想要的操作方法,然后返回结果吗?类似于:
HomeController controller = new HomeController();
return controller.Index();
发布于 2014-01-04 05:49:04
与模拟服务器传输相比,MVC仍然能够实际执行Server.TransferRequest。
public ActionResult Whatever()
{
string url = //...
Request.RequestContext.HttpContext.Server.TransferRequest(url);
return Content("success");//Doesn't actually get returned
}
https://stackoverflow.com/questions/799511
复制相似问题