【问题标题】:Implementing TransferResult in MVC 3 RC - does not work在 MVC 3 RC 中实现 TransferResult - 不起作用
【发布时间】:2011-05-09 15:33:30
【问题描述】:

任何想法如何解决以下问题?

有一个很好的 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 TransferResult 的 answer contains a modified implementation 与 MVC3 配合使用。结果发现它比以前更简单了。

【问题讨论】:

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


【解决方案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();
    }
}

【讨论】:

  • 如果使用 Visual Studio Devt Server 进行调试,此代码可以正常工作。但是,在本地 IIS 服务器上运行应用程序时,我确实遇到了上述错误。我还没有机会在远程服务器上测试该应用程序,但我清楚地观察到这两种配置在本地计算机上的行为差异。
【解决方案2】:

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

为什么不能只使用路由?

【讨论】:

  • 我使用 TransferResult 来实现错误处理:当前页面动作或视图正在处理中,如果有什么事情发生,则执行传输。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-09
  • 2012-01-22
相关资源
最近更新 更多