Beispiel #1
0
        /// <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;
        }