/// <summary> /// Renders a MVC controller action in a string. /// The given valueProvider provides the action parameters. /// </summary> /// <param name="routeValues"></param> /// <param name="resolver"></param> /// <returns></returns> public string InvokeAction(IDictionary <string, object> routeValues, IValueProvider valueProvider, Uri baseUrl) { var routeData = new RouteData(); foreach (var routeValue in routeValues) { routeData.Values.Add(routeValue.Key, routeValue.Value); } string controllerName = (string)routeData.Values["controller"]; string actionName = (string)routeData.Values["action"]; var currentContext = HttpContext.Current; bool httpContextIsNull = currentContext == null; if (httpContextIsNull) { currentContext = Context; HttpContext.Current = Context; } var virtualPath = RouteTable.Routes.GetVirtualPath(new RequestContext(new HttpContextWrapper(currentContext), routeData), routeData.Values); var httpContext = new LocalHttpContext(baseUrl, virtualPath.VirtualPath, currentContext.Request.ApplicationPath, currentContext.Server, currentContext.Cache); var requestContext = new RequestContext(); requestContext.RouteData = routeData; requestContext.HttpContext = httpContext; // Find the controller instance var controllerFactory = ControllerBuilder.Current.GetControllerFactory(); var controller = (Controller)controllerFactory.CreateController(requestContext, controllerName); var actionInvoker = controller.ActionInvoker; // All the variables are binded to the action parameters with a special value provider controller.ValueProvider = valueProvider; var controllerContext = new ControllerContext(requestContext, controller); // Invoke the action and fills the response actionInvoker.InvokeAction(controllerContext, actionName); if (httpContextIsNull) { HttpContext.Current = null; } // We extract the response to build the mail httpContext.Response.Close(); var bytes = ((LocalHttpResponse)httpContext.Response).stream.ToArray(); var body = Encoding.UTF8.GetString(bytes); return(body); }
/// <summary> /// Renders a MVC controller action in a string. /// The given valueProvider provides the action parameters. /// </summary> /// <param name="routeValues"></param> /// <param name="resolver"></param> /// <returns></returns> public string InvokeAction(IDictionary<string, object> routeValues, IValueProvider valueProvider, Uri baseUrl) { var routeData = new RouteData(); foreach (var routeValue in routeValues) { routeData.Values.Add(routeValue.Key, routeValue.Value); } string controllerName = (string)routeData.Values["controller"]; string actionName = (string)routeData.Values["action"]; var currentContext = HttpContext.Current; bool httpContextIsNull = currentContext == null; if (httpContextIsNull) { currentContext = Context; HttpContext.Current = Context; } var virtualPath = RouteTable.Routes.GetVirtualPath(new RequestContext(new HttpContextWrapper(currentContext), routeData), routeData.Values); var httpContext = new LocalHttpContext(baseUrl, virtualPath.VirtualPath, currentContext.Request.ApplicationPath, currentContext.Server, currentContext.Cache); var requestContext = new RequestContext(); requestContext.RouteData = routeData; requestContext.HttpContext = httpContext; // Find the controller instance var controllerFactory = ControllerBuilder.Current.GetControllerFactory(); var controller = (Controller)controllerFactory.CreateController(requestContext, controllerName); var actionInvoker = controller.ActionInvoker; // All the variables are binded to the action parameters with a special value provider controller.ValueProvider = valueProvider; var controllerContext = new ControllerContext(requestContext, controller); // Invoke the action and fills the response actionInvoker.InvokeAction(controllerContext, actionName); if (httpContextIsNull) { HttpContext.Current = null; } // We extract the response to build the mail httpContext.Response.Close(); var bytes = ((LocalHttpResponse)httpContext.Response).stream.ToArray(); var body = Encoding.UTF8.GetString(bytes); return body; }