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






3.75/5 (17投票s)
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。