在MVC 3 RC中实现TransferResult - 不起作用

时间:2010-11-13 20:59:23

标签: asp.net-mvc asp.net-mvc-3 server.transfer

如何解决以下问题?

TransferResult有一个很好的实现here,它在MVC 1,2上运行良好,但在MVC 3 RC上不起作用。

public class TransferResult : RedirectResult 
{ 
    public TransferResult(string url): base(url) 
    { 
    } 

    public override void ExecuteResult(ControllerContext context) 
    { 
        var httpContext = HttpContext.Current; 
        httpContext.RewritePath(Url, false); 
        IHttpHandler httpHandler = new MvcHttpHandler(); 
        httpHandler.ProcessRequest(HttpContext.Current); 
    } 
} 

在MVC 3 RC上,httpHandler.ProcessRequest失败并说'HttpContext.SetSessionStateBehavior' can only be invoked before 'HttpApplication.AcquireRequestState' event is raised.

如何重写此代码才能使其正常工作?

UPD :如果在VS 2010内置开发服务器上运行,代码可以正常工作,但无法在IIS 7.5 localhost上运行。问题仍未解决。

UPD2 answer contains a modified implementation的TransferResult适用于MVC3。事实证明它比过去更简单。

2 个答案:

答案 0 :(得分:1)

无法重现。以下在MVC 3 RC(Razor和WebForms)中完美无缺:

public class TransferResult : RedirectResult
{
    public TransferResult(string url)
        : base(url)
    {
    }

    public override void ExecuteResult(ControllerContext context)
    {
        var httpContext = HttpContext.Current;
        httpContext.RewritePath(Url, false);
        IHttpHandler httpHandler = new MvcHttpHandler();
        httpHandler.ProcessRequest(HttpContext.Current);
    }
}

public class HomeController : Controller
{
    public ActionResult Index()
    {
        return new TransferResult("/Home/About");
    }

    public ActionResult About()
    {
        return View();
    }
}

答案 1 :(得分:0)

我个人认为创建路由(必要时有路由约束(参见http://stephenwalther.com/blog/archive/2008/08/07/asp-net-mvc-tip-30-create-custom-route-constraints.aspx)远比这个'hack'更可取,它试图执行不可见的重定向,以便请求由不同的控制器和动作处理而不是路由指定的那个。

为什么不能只使用路由?