示例#1
0
        /// <summary>
        /// 渲染视图为字符串
        /// </summary>
        /// <param name="info">路由信息</param>
        /// <returns></returns>
        public async Task <string> RenderToStringAsync(RouteInformation info)
        {
            var razorViewEngine  = Web.GetService <IRazorViewEngine>();
            var tempDataProvider = Web.GetService <ITempDataProvider>();
            var httpContext      = Web.HttpContext;

            //var serviceProvider = Web.HttpContext.RequestServices;

            //var httpContext = new DefaultHttpContext { RequestServices = serviceProvider };

            var actionContext = new ActionContext(httpContext, GetRouteData(info), new ActionDescriptor());
            var viewResult    = GetView(razorViewEngine, actionContext, info);

            if (!viewResult.Success)
            {
                throw new InvalidOperationException($"找不到视图模板 {info.ActionName}");
            }

            using (var stringWriter = new StringWriter())
            {
                var viewDictionary = new ViewDataDictionary(new EmptyModelMetadataProvider(), new ModelStateDictionary());
                var viewContext    = new ViewContext(actionContext, viewResult.View, viewDictionary, new TempDataDictionary(actionContext.HttpContext, tempDataProvider), stringWriter, new HtmlHelperOptions());
                await viewResult.View.RenderAsync(viewContext);

                return(stringWriter.ToString());
            }
        }
示例#2
0
        /// <summary>
        /// 将视图写入文件
        /// </summary>
        /// <param name="info">路由信息</param>
        /// <returns></returns>
        public async Task WriteViewToFileAsync(RouteInformation info)
        {
            try
            {
                var html = await RenderToStringAsync(info);

                if (string.IsNullOrWhiteSpace(html))
                {
                    return;
                }
                var path      = Nigel.Helpers.Common.GetWebRootPath(string.IsNullOrWhiteSpace(info.FilePath) ? GetPath(info) : info.FilePath);
                var directory = System.IO.Path.GetDirectoryName(path);
                if (string.IsNullOrWhiteSpace(directory))
                {
                    return;
                }
                if (Directory.Exists(directory) == false)
                {
                    Directory.CreateDirectory(directory);
                }
                File.WriteAllText(path, html);
            }
            catch (Exception ex)
            {
                _logger.LogError(ex, "生成html静态文件失败");
            }
        }
示例#3
0
        /// <summary>
        /// 获取路径
        /// </summary>
        /// <param name="info">路由信息</param>
        /// <returns></returns>
        protected virtual string GetPath(RouteInformation info)
        {
            var area       = info.AreaName.SafeString();
            var controller = info.ControllerName.SafeString();
            var action     = info.ActionName.SafeString();
            var path       = info.TemplatePath.Replace("{area}", area).Replace("{controller}", controller).Replace("{action}", action);

            return(path.ToLower());
        }
示例#4
0
        /// <summary>
        /// 获取所有路由信息
        /// </summary>
        /// <returns></returns>
        public IEnumerable <RouteInformation> GetAllRouteInformations()
        {
            List <RouteInformation> list = new List <RouteInformation>();

            var actionDescriptors = this._actionDescriptorCollectionProvider.ActionDescriptors.Items;

            foreach (var actionDescriptor in actionDescriptors)
            {
                RouteInformation info = new RouteInformation();

                if (actionDescriptor.RouteValues.ContainsKey("area"))
                {
                    info.AreaName = actionDescriptor.RouteValues["area"];
                }

                // Razor页面路径以及调用
                if (actionDescriptor is PageActionDescriptor pageActionDescriptor)
                {
                    info.Path       = pageActionDescriptor.ViewEnginePath;
                    info.Invocation = pageActionDescriptor.RelativePath;
                }

                // 路由属性路径
                if (actionDescriptor.AttributeRouteInfo != null)
                {
                    info.Path = $"/{actionDescriptor.AttributeRouteInfo.Template}";
                }

                // Controller/Action 的路径以及调用
                if (actionDescriptor is ControllerActionDescriptor controllerActionDescriptor)
                {
                    if (info.Path.IsEmpty())
                    {
                        info.Path = $"/{controllerActionDescriptor.ControllerName}/{controllerActionDescriptor.ActionName}";
                    }

                    var routeInfo = SetHtmlInfo(info, controllerActionDescriptor);
                    if (!routeInfo)
                    {
                        continue;
                    }

                    info.ControllerName = controllerActionDescriptor.ControllerName;
                    info.ActionName     = controllerActionDescriptor.ActionName;
                    info.Invocation     = $"{controllerActionDescriptor.ControllerName}Controller.{controllerActionDescriptor.ActionName}";
                }

                info.Invocation += $"({actionDescriptor.DisplayName})";

                list.Add(info);
            }

            return(list);
        }
示例#5
0
        /// <summary>
        /// 设置Html信息
        /// </summary>
        /// <param name="routeInformation">路由信息</param>
        /// <param name="controllerActionDescriptor">控制器</param>
        private bool SetHtmlInfo(RouteInformation routeInformation,
                                 ControllerActionDescriptor controllerActionDescriptor)
        {
            var htmlAttribute = controllerActionDescriptor.ControllerTypeInfo.GetCustomAttribute <RazorHtmlAttribute>() ??
                                controllerActionDescriptor.MethodInfo.GetCustomAttribute <RazorHtmlAttribute>();

            if (htmlAttribute == null)
            {
                return(false);
            }

            routeInformation.FilePath      = htmlAttribute.Path;
            routeInformation.TemplatePath  = htmlAttribute.Template;
            routeInformation.IsPartialView = htmlAttribute.IsPartialView;
            routeInformation.ViewName      = htmlAttribute.ViewName;
            return(true);
        }
示例#6
0
        /// <summary>
        /// 获取路由数据
        /// </summary>
        /// <param name="info">路由信息</param>
        /// <returns></returns>
        protected virtual RouteData GetRouteData(RouteInformation info)
        {
            var routeData = new RouteData();

            if (!info.AreaName.IsEmpty())
            {
                routeData.Values.Add("area", info.AreaName);
            }
            if (!info.ControllerName.IsEmpty())
            {
                routeData.Values.Add("controller", info.ControllerName);
            }
            if (!info.ActionName.IsEmpty())
            {
                routeData.Values.Add("action", info.ActionName);
            }
            return(routeData);
        }
示例#7
0
 /// <summary>
 /// 获取Razor视图
 /// </summary>
 /// <param name="razorViewEngine">Razor视图引擎</param>
 /// <param name="actionContext">操作上下文</param>
 /// <param name="info">路由信息</param>
 /// <returns></returns>
 protected virtual ViewEngineResult GetView(IRazorViewEngine razorViewEngine, ActionContext actionContext, RouteInformation info)
 {
     return(razorViewEngine.FindView(actionContext, info.ViewName.IsEmpty() ? info.ActionName : info.ViewName,
                                     !info.IsPartialView));
 }