首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在ASP.NET MVC中模拟Server.Transfer?

如何在ASP.NET MVC中模拟Server.Transfer?
EN

Stack Overflow用户
提问于 2009-04-28 19:34:49
回答 9查看 81.5K关注 0票数 124

在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'中,这样它就可以访问了。一定有更好的办法。

EN

回答 9

Stack Overflow用户

发布于 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);
    }
票数 12
EN

Stack Overflow用户

发布于 2009-04-28 19:42:17

难道你不能创建一个你想要重定向到的控制器的实例,调用你想要的操作方法,然后返回结果吗?类似于:

 HomeController controller = new HomeController();
 return controller.Index();
票数 9
EN

Stack Overflow用户

发布于 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
}
票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/799511

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档