Ejemplo n.º 1
0
        private IRazorPage GetLayoutPage(ViewContext context, string executingFilePath, string layoutPath)
        {
            var layoutPageResult  = _viewEngine.GetPage(executingFilePath, layoutPath);
            var originalLocations = layoutPageResult.SearchedLocations;

            if (layoutPageResult.Page == null)
            {
                layoutPageResult = _viewEngine.FindPage(context, layoutPath);
            }

            if (layoutPageResult.Page == null)
            {
                var locations = string.Empty;
                if (originalLocations.Any())
                {
                    locations = Environment.NewLine + string.Join(Environment.NewLine, originalLocations);
                }

                if (layoutPageResult.SearchedLocations.Any())
                {
                    locations +=
                        Environment.NewLine + string.Join(Environment.NewLine, layoutPageResult.SearchedLocations);
                }

                throw new InvalidOperationException(Resources.FormatLayoutCannotBeLocated(layoutPath, locations));
            }

            var layoutPage = layoutPageResult.Page;

            return(layoutPage);
        }
Ejemplo n.º 2
0
 public RazorPageResult GetPage(string executingFilePath, string pagePath)
 {
     _locker.EnterReadLock();
     try
     {
         return(_current.GetPage(executingFilePath, pagePath));
     }
     finally
     {
         _locker.ExitReadLock();
     }
 }
        public override async Task ExecuteResultAsync(ActionContext context)
        {
            if (!(context is PageContext pageContext))
            {
                throw new ArgumentException($"{nameof(context)} should be instance of type {typeof(PageContext).Name}");
            }


            string executingFilePath = ".";
            string basePath          = this.Page.Path;
            string fileName          = Path.GetFileName(basePath);
            string pageName          = Path.GetFileNameWithoutExtension(basePath);
            string directory         = basePath.Substring(0, basePath.Length - fileName.Length);

            while (directory[directory.Length - 1] == '/')
            {
                directory = directory.Substring(0, directory.Length - 1);
            }

            HttpContext      httpContext     = pageContext.HttpContext;
            IRazorViewEngine engine          = httpContext.RequestServices.GetRequiredService <IRazorViewEngine>();
            ICultureContext  cultureContext  = httpContext.RequestServices.GetRequiredService <ICultureContext>();
            IFileCultureInfo fileCultureInfo = httpContext.RequestServices.GetRequiredService <ICultureFileCache>().Get(_requestedCulture, directory, pageName, "cshtml");

            if (fileCultureInfo != null)
            {
                httpContext.RequestServices.GetRequiredService <ILocalizedViewRenderContextAccessor>().Context = new LocalizedViewRenderContext(_requestedCulture, fileCultureInfo.Culture, cultureContext.UrlCultureSpecifier);
                string relativePath = fileCultureInfo.RelativePath; // 7 == ".cshtml".Length
                if (!relativePath.Equals(this.Page.Path))
                {
                    RazorPageResult pageResult        = engine.GetPage(executingFilePath, relativePath);
                    Page            page              = (Page)pageResult.Page;
                    PageContext     resultPageContext = pageContext.CreateCopy();
                    ViewContext     resultViewContext = this.Page.ViewContext.CreateCopy();
                    page.ViewContext = resultViewContext;
                    resultViewContext.ExecutingFilePath             = relativePath;
                    resultPageContext.ActionDescriptor.PageTypeInfo = page.GetType().GetTypeInfo();
                    resultPageContext.ActionDescriptor.RelativePath = relativePath;
                    page.PageContext = resultPageContext;
                    page.HtmlEncoder = this.Page.HtmlEncoder;
                    page.Path        = relativePath;
                    this.Page        = page;
                }
            }
            else
            {
                httpContext.RequestServices.GetRequiredService <ILocalizedViewRenderContextAccessor>().Context = new LocalizedViewRenderContext(_requestedCulture, null, cultureContext.UrlCultureSpecifier);
            }

            var executor = context.HttpContext.RequestServices.GetRequiredService <PageResultExecutor>();
            await executor.ExecuteAsync(pageContext, this);
        }
Ejemplo n.º 4
0
        /// <summary>
        /// 查找Razor页面
        /// </summary>
        /// <param name="razorViewEngine">Razor视图引擎</param>
        /// <param name="actionContext">操作上下文</param>
        /// <param name="pageName">页面名称。执行文件路径:/Pages/Components/Forms/Form.cshtml</param>
        private IRazorPage FindPage(IRazorViewEngine razorViewEngine, ActionContext actionContext, string pageName)
        {
            var getPageResult = razorViewEngine.GetPage(null, pageName);

            if (getPageResult.Page != null)
            {
                return(getPageResult.Page);
            }
            var findPageResult = razorViewEngine.FindPage(actionContext, pageName);

            if (findPageResult.Page != null)
            {
                return(findPageResult.Page);
            }
            throw new ArgumentNullException($"未找到视图: {pageName}");
        }
Ejemplo n.º 5
0
        private IRazorPage FindPage(ActionContext actionContext, string partialName)
        {
            var getPartialResult = _viewEngine.GetPage(null, partialName);

            if (getPartialResult.Page != null)
            {
                return(getPartialResult.Page);
            }
            var findPartialResult = _viewEngine.FindPage(actionContext, partialName);

            if (findPartialResult.Page != null)
            {
                return(findPartialResult.Page);
            }
            var searchedLocations = getPartialResult.SearchedLocations.Concat(findPartialResult.SearchedLocations);
            var errorMessage      = string.Join(
                Environment.NewLine,
                new[] { $"Unable to find partial '{partialName}'. The following locations were searched:" }.Concat(searchedLocations));;

            throw new InvalidOperationException(errorMessage);
        }