65.9K
CodeProject 正在变化。 阅读更多。
Home

ASP.NET MVC 中的预编译 Razor 视图

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.75/5 (17投票s)

2017年2月8日

CPOL

3分钟阅读

viewsIcon

49558

downloadIcon

472

ASP.NET MVC 中的预编译 Razor 视图

引言

几个月前,我正在使用 ASP.NET MVC 开发一个网站。我发现如果视图数量巨大,管理部署会很困难。视图不会生成编译时错误。我搜索了一下,发现有一些方法可以为 MVC 应用程序生成一个 DLL,而不是部署所有 .cshtml 文件。我将分享启用 Razor 视图预编译和单个 DLL 部署的技术。

背景

任何编译型语言的一个特性是在编译时验证错误和警告。这可以在设计阶段而不是在程序运行后减少错误。ASP.NET MVC 采用混合编译方法。模型和控制器是预编译的,但视图是在运行时编译的。因此,直到视图在浏览器中运行之前,都无法检测到视图中的任何错误。
由于视图不是预编译的,如果项目中有很多视图,加载 MVC 应用程序的启动时间会变慢。

为了解决这个问题,可以预编译视图。我们将讨论如何做到这一点。

让我们从一个例子开始。

Using the Code

打开 Visual Studio。

选择 MVC Web 应用程序。
选择基本模板
创建一个控制器 Home

在控制器中写几行代码

namespace PrecompileView.Controllers
{
    public class HomeController : Controller
    {
        public ActionResult Index()
        {
            ViewBag.myText = "999";
            return View();
        }     
    }
}

添加一个名为Index的视图

打开 Index.cshtml 文件。
添加以下行,其中ViewBag拼写错误

@{
    ViewBag.Title = "Home Page";
}

<h3>@Convert.ToInt32(ViewBagg.MyText)</h3>

运行应用程序。
将发生以下运行时异常

为了避免这个运行时错误,我们可以启用 Razor 视图的预编译,以便生成设计时编译错误。在 ASP.NET MVC 应用程序中有多种方法可以启用预编译。
我们将讨论以下方法

  • 使用MvcBuildViews标签进行 Razor 预编译
  • 使用RazorGenerator进行 Razor 预编译

选项 #1 - 使用 MvcBuildViews 标签进行 Razor 预编译

这可以通过更改 .csProject 文件中MvcBuildViews的值来实现。

步骤如下

卸载.csProject

编辑.csProject

我们可以设置<MvcBuildViews>True</MvcBuildViews>来启用预编译,但我们也可以选择在 Release 构建中进行预编译。
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">部分,将MvcBuildViews元素设置为false<MvcBuildViews>false</MvcBuildViews>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">部分,将MvcBuildViews元素设置为true<MvcBuildViews>true</MvcBuildViews>.

我们需要保存项目并重新加载它。
现在,如果我们以Debug模式重新构建项目,将不会有错误。

我们将在Release构建中获得错误

选项 #2 - 使用 RazorGenerator 进行 Razor 预编译

使用上一种方法,我们可以启用预编译,但仍然需要部署 .cshtml 文件。如果我们能将控制器和视图绑定到一个 DLL 中,那将非常方便部署。通过使用RazorGenerator,我们可以实现这一点。

步骤如下

.csProject 文件恢复到之前的状态。

转到工具,然后转到扩展管理器

搜索Razor Generator

点击下载按钮。

安装完成后,重新启动 Visual Studio

在自定义工具中插入RazorGenerator

Index.cshtml 上点击运行自定义工具

运行自定义工具将生成 Index.generated.cs 文件。

.cshtml 文件现在已被编译到 Index.generated.cs 文件中,其内容如下

现在,如果我们构建项目,我们将得到以下编译时错误

我们将纠正错误并成功构建项目。

 public class HomeController : Controller
    {
        public ActionResult Index()
        {
            ViewBag.myText = "999";
            return View();
        }   
    }

现在构建将成功。现在我们将观察这种方法中最有趣的部分,即部署。

打开 Visual Studio 的开发人员命令提示符

输入ildasm

导航通过 PrecompileView.dll。我们可以看到 Index.cshtml 现在是 DLL 的一部分。

因此,现在部署不再需要 .cshtml 文件了。

我们可以只部署 PrecompileView.dll 来部署我们的整个 MVC 应用程序。

您可以在此处下载源代码。

关注点

使用RazorGenerator,我们可以为 MVC 应用程序部署单个 DLL 文件。对于任何 Web 应用程序,CSS、JavaScript 和图像文件都是应用程序的一部分。我们可以将这些文件设置为嵌入资源,以生成单个 DLL。

© . All rights reserved.