/// <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); } }
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); } }
public abstract StringBuilder Render(ViewResult viewResult, ViewRenderingContext context);