예제 #1
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="view"></param>
        /// <param name="viewResult"></param>
        /// <param name="context"></param>
        protected void HydrateView(ViewResult viewResult, IView view, ViewRenderingContext context)
        {
            var urlHelper = this.BuildUrlHelper(viewResult, view, context);

            if (view is IViewWithData)
            {
                var viewWithData = view as IViewWithData;

                if (viewResult.ViewData == null)
                {
                    throw new ArgumentNullException("viewData", "No viewdata passed to view `" + view.GetType() + "`");
                }

                var actualViewDataType = viewResult.ViewData.GetType();
                if (!actualViewDataType.IsOrDerivesFrom(viewWithData.ViewDataType))
                {
                    throw new ArgumentException("`" + actualViewDataType + "` is not convertible to `" + viewWithData.ViewDataType + "` as defined in the view");
                }

                var htmlHelper = Activator.CreateInstance(typeof(HtmlHelper <>).MakeGenericType(viewWithData.ViewDataType), viewResult, context.RequestUrl, context.RequestState, context.ContextItems) as HtmlHelper;

                (htmlHelper as IHtmlHelperT).SetViewData(viewResult.ViewData);

                view.SetHelpers(htmlHelper, urlHelper);
                viewWithData.SetViewData(viewResult.ViewData);
            }
            else
            {
                var htmlHelper = new HtmlHelper(viewResult, context.RequestUrl, context.RequestState, context.ContextItems);
                view.SetHelpers(htmlHelper, urlHelper);
            }
        }
예제 #2
0
        protected virtual UrlHelper BuildUrlHelper(ViewResult result, IView view, ViewRenderingContext context)
        {
            var culture    = CultureInfo.CurrentUICulture;
            var regionInfo = culture.IsNeutralCulture ? RegionInfo.CurrentRegion : new RegionInfo(culture.Name);

            return(new UrlHelper(context.RequestUrl, result.AreaName, regionInfo.TwoLetterISORegionName, culture.Name, context.ContextItems));
        }
        /// <summary>
        /// Renders a View
        /// </summary>
        /// <param name="view"></param>
        /// <param name="viewPath">The virtual path to the view</param>
        /// <param name="viewData">The data for the view</param>
        // TODO: Make async version
        public static IHtmlContent RenderView(this IView view, string viewPath, object viewData = null)
        {
            if (string.IsNullOrEmpty(viewPath))
            {
                throw new ArgumentException("viewPath");
            }

            if (!viewPath.EndsWith(".cshtml"))
            {
                viewPath += ".cshtml";
            }

            try
            {
                var viewType   = view.Container.Resolve <IViewResolver>().Resolve(viewPath);
                var viewEngine = view.Container.Resolve <IViewRendererFinder>().FindViewRenderer(viewType);
                var viewResult = new ViewResult(viewType, view.ViewResult.AreaName, viewData);

                var stringBuilder    = new StringBuilder();
                var renderingContext = new ViewRenderingContext
                {
                    Writer = new StringWriter(stringBuilder)
                };

                var renderTask = viewEngine.Render(viewResult, view.PipelineContext, renderingContext);
                renderTask.GetAwaiter().GetResult();

                // TODO: is this still the best approach?
                return(new HtmlString(stringBuilder.ToString()));
            }
            catch (Exception e)
            {
                log.Error(e, "Failed to render view `{ViewPath}`", viewPath);
                return(null);
            }
        }
예제 #4
0
 public abstract StringBuilder Render(ViewResult viewResult, ViewRenderingContext context);