5

以下を修正する方法はありますか?

TransferResult の優れた実装がここにあります。これは 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この回答には、 MVC3 で動作する TransferResult の変更された実装が含まれています。以前よりもさらにシンプルになっていることがわかります。

4

2 に答える 2

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();
    }
}
于 2010-11-14T23:00:08.917 に答える
0

個人的には、ルートを作成すると思います (必要に応じてルート制約を使用します ( http://stephenwalther.com/blog/archive/2008/08/07/asp-net-mvc-tip-30-create-custom-route-constraints を参照)。 aspx ) は、ルーティングによって指定されたものとは異なるコントローラーとアクションによって要求が処理されるように、目に見えないリダイレクトを実行しようとするこの「ハック」よりもはるかに望ましい方法です。

ルーティングだけを使用できないのはなぜですか?

于 2010-11-14T00:20:26.857 に答える