private static string DetermineVirtualPath(InheritedThemeFileResult resolveResult) { if (resolveResult.RelativePath.EndsWith(".cshtml", StringComparison.OrdinalIgnoreCase)) { // ASP.NET BuildManager requires the original path for razor views, // otherwise an exception is thrown return(resolveResult.OriginalVirtualPath); } else { return(resolveResult.ResultVirtualPath); } }
public InheritedVirtualThemeFile(InheritedThemeFileResult resolveResult) : base(DetermineVirtualPath(resolveResult)) { ResolveResult = resolveResult; }
/// <summary> /// Tries to resolve a file up in the current theme's hierarchy chain. /// </summary> /// <param name="virtualPath">The original virtual path of the theme file</param> /// <returns> /// If the current working themme is based on another theme AND the requested file /// was physically found in the theme's hierarchy chain, an instance of <see cref="InheritedThemeFileResult" /> will be returned. /// In any other case the return value is <c>null</c>. /// </returns> public InheritedThemeFileResult Resolve(string virtualPath) { Guard.NotEmpty(virtualPath, nameof(virtualPath)); if (virtualPath[0] != '~') { virtualPath = VirtualPathUtility.ToAppRelative(virtualPath); } if (!ThemeHelper.PathIsInheritableThemeFile(virtualPath)) { return(null); } bool isExplicit = false; virtualPath = ThemeHelper.TokenizePath(virtualPath, out var requestedThemeName, out var relativePath, out var query); Func <InheritedThemeFileResult> nullOrFile = () => { return(isExplicit ? new InheritedThemeFileResult { IsExplicit = true, OriginalVirtualPath = virtualPath, Query = query } : null); }; ThemeManifest currentTheme = ResolveTheme(requestedThemeName, relativePath, query, out isExplicit); if (currentTheme?.BaseTheme == null) { // dont't bother resolving files: the current theme is not inherited. // Let the current VPP do the work. return(nullOrFile()); } if (!currentTheme.ThemeName.Equals(requestedThemeName, StringComparison.OrdinalIgnoreCase)) { if (!_themeRegistry.IsChildThemeOf(currentTheme.ThemeName, requestedThemeName)) { return(nullOrFile()); } } else if (isExplicit && currentTheme.BaseTheme != null) { // A file from the base theme has been requested currentTheme = currentTheme.BaseTheme; } var fileKey = new FileKey(currentTheme.ThemeName, relativePath, query); InheritedThemeFileResult result; using (_rwLock.GetUpgradeableReadLock()) { if (!_files.TryGetValue(fileKey, out result)) { using (_rwLock.GetWriteLock()) { // ALWAYS begin the search with the current working theme's location! string actualLocation = LocateFile(currentTheme.ThemeName, relativePath, out var resultVirtualPath, out var resultPhysicalPath); if (actualLocation != null) { result = new InheritedThemeFileResult { RelativePath = relativePath, OriginalVirtualPath = virtualPath, ResultVirtualPath = resultVirtualPath, ResultPhysicalPath = resultPhysicalPath, OriginalThemeName = requestedThemeName, ResultThemeName = actualLocation, IsExplicit = isExplicit, Query = query }; } _files[fileKey] = result; } } } if (result == null) { return(nullOrFile()); } return(result); }