MVC6是否支持预编译视图?

时间:2015-11-04 09:32:58

标签: asp.net-core asp.net-core-mvc

In< MVC6我可以在发布时预编译.cshtml文件,这样他们就不必在被请求时首次点击时编译。

是否可以在MVC6中预编译.cshtml文件?

3 个答案:

答案 0 :(得分:21)

csproj(VS 2017)回答

添加对Microsoft.AspNetCore.Mvc.Razor.ViewCompilation的引用:

<ItemGroup>
    <PackageReference Include="Microsoft.AspNetCore.Mvc.Razor.ViewCompilation" Version="1.1.0-msbuild3-update1" PrivateAssets="All" />
</ItemGroup>

发布项目时启用剃刀视图编译。

<PropertyGroup>
    <MvcRazorCompileOnPublish>true</MvcRazorCompileOnPublish>
</PropertyGroup>

有关详细信息,请参阅this GitHub问题。

xproj和project.json(VS 2015)回答

Razor预编译在ASP.NET Core 1.0 MVC 6 RC2中被删除但在ASP.NET Core 1.1中使用了一个工具brought back,你可以这样添加:

  1. Microsoft.AspNetCore.Mvc.Razor.ViewCompilation.Design部分下添加对dependencies的引用,如下所示:
  2. "Microsoft.AspNetCore.Mvc.Razor.ViewCompilation.Design": {
        "type": "build",
        "version": "1.1.0-preview4-final"
    }
    
    1. Microsoft.AspNetCore.Mvc.Razor.ViewCompilation.Tools部分下添加对tools的引用,如下所示:
    2. "Microsoft.AspNetCore.Mvc.Razor.ViewCompilation.Tools": "1.1.0-preview4-final",
      
      1. 添加一个postpublish脚本来调用视图编译器:
      2. "scripts": {
           "postpublish": "dotnet razor-precompile --configuration %publish:Configuration% --framework %publish:TargetFramework% --output-path %publish:OutputPath% %publish:ProjectPath%"
        }
        

答案 1 :(得分:12)

回答Visual Studio 2017:

从Visual Studio解决方案资源管理器编辑项目.csproj,如果属性不存在,则添加值为true的MvcRazorCompileOnPublishPreserveCompilationContext属性

<PropertyGroup>
      <TargetFramework>netcoreapp1.1</TargetFramework>
      ....
      <MvcRazorCompileOnPublish>true</MvcRazorCompileOnPublish>
      <PreserveCompilationContext>true</PreserveCompilationContext>
</PropertyGroup>

通过nuget或编辑.csproj

将包Microsoft.AspNetCore.Mvc.Razor.ViewCompilation添加到项目中
<ItemGroup>
     ...
    <PackageReference Include="Microsoft.AspNetCore.Mvc.Razor.ViewCompilation" Version="1.1.0" />
</ItemGroup>

**以下答案仅适用于ASP.NET Core RC1。 **

您可以创建一个继承自RazorPreCompileModule的类,并覆盖EnablePreCompilation方法,将razor预编译设置为true。

using Microsoft.AspNet.Mvc.Razor.Precompilation;
using Microsoft.Dnx.Compilation.CSharp;

namespace PrecompilationWebSite
{
    public class RazorPreCompilation : RazorPreCompileModule
    {
        protected override bool EnablePreCompilation(BeforeCompileContext   context) => true;
    } 
}

Startup.cs中引用此方法:

public class Startup
{
    // Set up application services
    public void ConfigureServices(IServiceCollection services)
    {
        // Add MVC services to the services container
        services
            .AddMvc()
            .AddPrecompiledRazorViews(GetType().GetTypeInfo().Assembly);
    }

    public void Configure(IApplicationBuilder app)
    {
        app.UseCultureReplacer();

        app.UseMvcWithDefaultRoute();
    }
}

您可以在asp.net github页面上查看整个项目的预编译示例project

您也可以在发布时编译整个应用程序。

enter image description here

将发布编译为nuget包的整个应用程序。

答案 2 :(得分:1)

最后,从ASP.NET Core 1.1开始支持Razor视图预编译。

以下是公告:Announcing the Fastest ASP.NET Yet, ASP.NET Core 1.1 RTM

它说:

  

视图的Razor语法提供了灵活的开发体验   其中视图的编译在运行时自动发生   视图已执行。但是,在某些情况下,您可以这样做   不希望在运行时编译Razor语法。你现在可以编译了   Razor认为您的应用程序引用并部署它们   应用。要启用视图编辑作为发布您的   应用,

     
      
  1. 添加引用   “Microsoft.AspNetCore.Mvc.Razor.ViewCompilation.Design”下   “依赖”部分。
  2.   
  3. 添加引用   “Microsoft.AspNetCore.Mvc.Razor.ViewCompilation.Tools”下的工具   部分
  4.   
  5. 添加一个postpublish脚本来调用视图编译器:
  6.   
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="hibernate.connection.username">root</property>
        <property name="hibernate.connection.password">""</property>
        <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/database</property>
        <property name="hibernate.dialect">org.hibernate.dialect.MySQLInnoDBDialect</property>
        <property name="show_sql">true</property> 
        <property name="connection.pool_size">1</property>

        <mapping class="pojo.Student"></mapping>

    </session-factory>
</hibernate-configuration>
相关问题