mirror of https://github.com/abpframework/abp.git
21 changed files with 81 additions and 65 deletions
@ -0,0 +1,62 @@ |
|||
using System; |
|||
using System.Collections.Generic; |
|||
using System.Linq; |
|||
using Microsoft.AspNetCore.Mvc.ApplicationParts; |
|||
using Microsoft.AspNetCore.Mvc.Razor.Compilation; |
|||
using Microsoft.Extensions.DependencyInjection; |
|||
using Volo.Abp.VirtualFileSystem; |
|||
|
|||
namespace Volo.Abp.AspNetCore.Mvc.ViewFeatures |
|||
{ |
|||
/// <summary>
|
|||
/// The code for this class comes from
|
|||
/// https://github.com/dotnet/aspnetcore/blob/master/src/Mvc/Mvc.Razor/src/ApplicationParts/RazorCompiledItemFeatureProvider.cs
|
|||
/// </summary>
|
|||
public class AbpRazorCompiledItemFeatureProvider : IApplicationFeatureProvider<ViewsFeature> |
|||
{ |
|||
private readonly IAbpApplication _application; |
|||
|
|||
public AbpRazorCompiledItemFeatureProvider(IAbpApplication application) |
|||
{ |
|||
_application = application; |
|||
} |
|||
|
|||
public void PopulateFeature(IEnumerable<ApplicationPart> parts, ViewsFeature feature) |
|||
{ |
|||
var virtualFileProvider = _application.ServiceProvider |
|||
.GetRequiredService<IVirtualFileProvider>(); |
|||
|
|||
foreach (var provider in parts.OfType<IRazorCompiledItemProvider>()) |
|||
{ |
|||
// Ensure parts do not specify views with differing cases. This is not supported
|
|||
// at runtime and we should flag at as such for precompiled views.
|
|||
var duplicates = provider.CompiledItems |
|||
.GroupBy(i => i.Identifier, StringComparer.OrdinalIgnoreCase) |
|||
.FirstOrDefault(g => g.Count() > 1); |
|||
|
|||
if (duplicates != null) |
|||
{ |
|||
var viewsDifferingInCase = string.Join(Environment.NewLine, duplicates.Select(d => d.Identifier)); |
|||
|
|||
var message = string.Join( |
|||
Environment.NewLine, |
|||
"The following precompiled view paths differ only in case, which is not supported:", |
|||
viewsDifferingInCase); |
|||
throw new InvalidOperationException(message); |
|||
} |
|||
|
|||
foreach (var item in provider.CompiledItems) |
|||
{ |
|||
// Skip pages existing in the virtual file system. This allows us to replace pre-compiled pages.
|
|||
if (virtualFileProvider.GetFileInfo(item.Identifier).Exists) |
|||
{ |
|||
continue; |
|||
} |
|||
|
|||
var descriptor = new CompiledViewDescriptor(item); |
|||
feature.ViewDescriptors.Add(descriptor); |
|||
} |
|||
} |
|||
} |
|||
} |
|||
} |
|||
Loading…
Reference in new issue