如何在ASP.NET Core MVC中重用视图(页面)?

时间:2017-12-09 09:01:27

标签: razor asp.net-core reusability

在ASP.NET Core MVC之前,我们将使用RazorGenerator将视图编译到程序集中,我们将在另一个项目中重用这些视图,方法是引入一个自定义ViewEngine,它将从程序集而不是文件系统加载视图。 / p>

在ASP.NET Core MVC中有预编译视图这个概念,它开箱即用于版本2.0,并创建一个按照惯例名称为 project_name的程序集.PrecompiledViews.dll

我有两个问题,但我无法在Google上找到答案。 首先,我不知道如何在另一个项目中重用该DLL。就像我在About.cshtml中有CompanyBase.dll页面一样,如何在ProjectAlpha中重复使用该页面/视图?

而且我也不希望在发布时进行视图编译。如何在构建时将其更改?

3 个答案:

答案 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());
             });
}

另一种方法是使用EmbeddedFileProviderthis 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)

我使用以下框架将视图编译成dll取得了成功:

https://github.com/ExtCore/ExtCore

整个框架可能对您没有用,但是您当然可以分析源代码以了解该框架如何实现的。