protected FlowStepComponent( string viewName, IPlatformSettings platformSettings, string customLoadingViewName = null, [CallerFilePath] string componentPath = null) : this($"~{GetCustomViewPath(componentPath, viewName, "cshtml")}") { PlatformSettings = platformSettings; UpdateCachedLoaderView(); SetComponentId(); _loadingViewContent = new Lazy <string>(() => { string customLoadingViewFullPath = null; if (customLoadingViewName != null) { customLoadingViewFullPath = GetCustomViewPath(componentPath, customLoadingViewName).TrimStart('~', '/'); } return(customLoadingViewFullPath != null ? ResolveView(customLoadingViewFullPath) : string.Empty); }); void SetComponentId() { var componentPrefix = ViewName.Replace(".cshtml", string.Empty, StringComparison.InvariantCultureIgnoreCase) .Replace('\\', '_') .Replace('/', '_') .Replace('~', '_') .Replace('.', '_') .TrimStart('_'); ComponentId = $"{componentPrefix}_{Guid.NewGuid()}"; } string ResolveView(string customLoadingViewFullPath) { #if DEBUG || FRAMEWORKDEVELOPMENT //so it can be changed in the same debugging session return(DoResolve()); #else return(LoadingViewsCache.GetOrAdd(customLoadingViewFullPath, k => DoResolve())); #endif string DoResolve() { var path = Path.Combine(HttpContext.Resolve <IWebHostEnvironment>().ContentRootPath, customLoadingViewFullPath); if (!File.Exists(path)) { Logger.Error(() => $"Could not find loading view at :{path}"); return(string.Empty); } return(File.ReadAllText(path).Replace("\"~/", $"\"{HttpContext.GetBaseUrl()}")); } } void UpdateCachedLoaderView() { if (platformSettings.DeferredComponentLoaderViewEmbeddedResourceName != null && Template.Key != platformSettings.DeferredComponentLoaderViewEmbeddedResourceName) { var textResource = EmbeddedResourceReader.ReadTextResource( platformSettings.DeferredComponentLoaderViewEmbeddedResourceName, GetType().Assembly); Template = new KeyValuePair <string, string>( platformSettings.DeferredComponentLoaderViewEmbeddedResourceName, textResource); } } }