在ASP.NET Core MVC之前,我们将使用RazorGenerator将视图编译到程序集中,我们将在另一个项目中重用这些视图,方法是引入一个自定义ViewEngine,它将从程序集而不是文件系统加载视图。 / p>
在ASP.NET Core MVC中有预编译视图这个概念,它开箱即用于版本2.0,并创建一个按照惯例名称为 project_name的程序集.PrecompiledViews.dll
我有两个问题,但我无法在Google上找到答案。
首先,我不知道如何在另一个项目中重用该DLL。就像我在About.cshtml
中有CompanyBase.dll
页面一样,如何在ProjectAlpha
中重复使用该页面/视图?
而且我也不希望在发布时进行视图编译。如何在构建时将其更改?
答案 0 :(得分:3)
ASP.NET Core中有一个Application Parts概念:
应用程序部件是对应用程序资源的抽象,可以从中发现控制器,视图组件或标记助手等MVC功能。
将以下内容添加到.csproj(对于包含视图的库)中,将视图作为嵌入资源包含在dll中:
<ItemGroup>
<EmbeddedResource Include="Views\**\*.cshtml" />
</ItemGroup>
然后将程序集添加为应用程序部分并为View发现注册ViewComponentFeatureProvider
:
// using System.Reflection;
// using Microsoft.AspNetCore.Mvc.ApplicationParts;
// using Microsoft.AspNetCore.Mvc.ViewComponents;
public void ConfigureServices(IServiceCollection services)
{
...
var assembly = typeof(ClassInYourLibrary).GetTypeInfo().Assembly;
var part = new AssemblyPart(assembly);
services.AddMvc()
.ConfigureApplicationPartManager(p => {
p.ApplicationParts.Add(part);
p.FeatureProviders.Add(new ViewComponentFeatureProvider());
});
}
另一种方法是使用EmbeddedFileProvider
。 this SO answer中描述了这种方法。
答案 1 :(得分:1)
如果要使用其他程序集中的视图,则必须在中另外使用 EmbeddedFileProvider。
因此,完整的ConfigureServices应该类似于:
...
var assembly = typeof( Iramon.Web.Common.ViewComponents.ActiveAccountViewComponent).GetTypeInfo().Assembly;
var part = new AssemblyPart(assembly);
services.AddMvc()
.ConfigureApplicationPartManager(p => {
p.ApplicationParts.Add(part);
p.FeatureProviders.Add(new ViewComponentFeatureProvider());
});
var embeddedFileProvider = new EmbeddedFileProvider(
assembly
);
//Add the file provider to the Razor view engine
services.Configure<RazorViewEngineOptions>(options =>
{
options.FileProviders.Add(embeddedFileProvider);
});
答案 2 :(得分:0)