How to simulate Server.Transfer in ASP.NET MVC?

后端 未结 14 1605
死守一世寂寞
死守一世寂寞 2020-11-22 12:00

In ASP.NET MVC you can return a redirect ActionResult quite easily :

 return RedirectToAction(\"Index\");

 or

 return RedirectToRoute(new { controller = \"         


        
14条回答
  •  借酒劲吻你
    2020-11-22 12:44

    I wanted to re-route the current request to another controller/action, while keeping the execution path exactly the same as if that second controller/action was requested. In my case, Server.Request wouldn't work because I wanted to add more data. This is actually equivalent the current handler executing another HTTP GET/POST, then streaming the results to the client. I'm sure there will be better ways to achieve this, but here's what works for me:

    RouteData routeData = new RouteData();
    routeData.Values.Add("controller", "Public");
    routeData.Values.Add("action", "ErrorInternal");
    routeData.Values.Add("Exception", filterContext.Exception);
    
    var context = new HttpContextWrapper(System.Web.HttpContext.Current);
    var request = new RequestContext(context, routeData);
    
    IController controller = ControllerBuilder.Current.GetControllerFactory().CreateController(filterContext.RequestContext, "Public");
    controller.Execute(request);
    

    Your guess is right: I put this code in

    public class RedirectOnErrorAttribute : ActionFilterAttribute, IExceptionFilter
    

    and I'm using it to display errors to developers, while it'll be using a regular redirect in production. Note that I didn't want to use ASP.NET session, database, or some other ways to pass exception data between requests.

提交回复
热议问题