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); }
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); }
/// <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}"); }
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); }