Реализация TransferResult в MVC 3 RC - не работает
Есть идеи как исправить ниже?
Здесь есть отличная реализация 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. Проблема до сих пор не решена.
UPD2 Этот ответ содержит модифицированную реализацию TransferResult, которая работает с MVC3. Оказывается, это даже проще, чем раньше.
2 ответа
Невозможно воспроизвести. Следующее прекрасно работает в 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();
}
}
Лично я думаю, что создание маршрутов (с ограничениями маршрута при необходимости (см. http://stephenwalther.com/blog/archive/2008/08/07/asp-net-mvc-tip-30-create-custom-route-constraints.aspx) гораздо предпочтительнее этого "хака", который пытается выполнить невидимое перенаправление, так что запрос обрабатывается другим контроллером и действием, отличным от того, который указан маршрутизацией.
Почему вы не можете просто использовать маршрутизацию?