在ASP.NET MVC中编译视图


558

我想要一个msbuild任务来编译视图,以便可以查看编译时是否存在编译时错误。有任何想法吗?


1
我不知道您使用的是哪种Viewengine,但是如果您使用的是Razor,则可能要查看我的博客文章:<a href =“ chrisvandesteeg.nl/2010/11/22/…您的asp.net mvc Razor视图进入一个单独的dll </a>应该也可以将该代码用于其他viewengine,但尚未完成并进行测试
Chris van de Steeg,2010年

Answers:


154

坦率地说,我建议使用RazorGenerator nuget软件包。这样一来,您的视图就会.designer.cs在保存时生成一个文件,并且除了获得视图的编译时错误外,它们还被预先编译到了程序集中(=更快的预热),并且Resharper也提供了一些其他帮助。

要使用此功能,在ASP.NET MVC项目中包括RazorGenerator nuget包,并在“ 工具”→“扩展和更新 ”下的项目下安装“ Razor Generator ”扩展。

我们使用它,使用这种方法的每次编译开销要少得多。最重要的是,我可能会推荐RedGate的.NET Demon,它可以进一步大大减少编译时间的影响。

希望这可以帮助。


1
VS2012有类似的解决方案吗?
丹尼尔(Daniel)

6
不幸的是,它仅支持C#,不支持VB.Net
Ed DeGagne 2013年

3
@zoidbergi RazorGenerator与VS2012一起使用;使用RazorGenerator.Mvc和RazorGenerator.MsBuild时:不需要扩展。请参阅stacktoheap.com
Jeroen K

2
可以将其仅用于查找错误吗?还是在部署应用程序时取代视图引擎?
niico

我已经安装了RazorGenerator nuget软件包和Razor Generator扩展。我的项目没有任何改变。没有出现.designer.cs文件。我使用Visual Studio 2017年
迈克尔Samteladze

563

从RC1的自述单词doc(未由Google索引)

ASP.NET编译器的生成后步骤

当前,视图文件内的错误直到运行时才被检测到。为了让您在编译时检测到这些错误,ASP.NET MVC项目现在包括一个MvcBuildViews属性,该属性默认情况下处于禁用状态。要启用此属性,请打开项目文件并将MvcBuildViews属性设置为true,如以下示例所示:

<Project ToolsVersion="3.5" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
    <MvcBuildViews>true</MvcBuildViews>
  </PropertyGroup>

注意 启用此功能会增加一些构建时间。

您可以通过执行以下步骤来更新使用早期版本的MVC创建的项目,以包括视图的构建时验证:

  1. 在文本编辑器中打开项目文件。
  2. 在最上面的元素下添加以下<PropertyGroup>元素: <MvcBuildViews>true</MvcBuildViews>
  3. 在项目文件的末尾,取消注释<Target Name="AfterBuild">元素,并对其进行修改以匹配以下内容:
<Target Name="AfterBuild" Condition="'$(MvcBuildViews)'=='true'">
    <AspNetCompiler VirtualPath="temp" PhysicalPath="$(ProjectDir)\..\$(ProjectName)" />
</Target>

27
如果这不适用于您的项目,请检查项目文件中的某处是否没有<MvcBuildViews> false </ MvcBuildViews>。它覆盖了我在其之上添加的新<MvcBuildViews>元素。
阿德里安·格里戈里

3
@mxmissile:斯科特·格思里推荐添加Web部署项目到您的解决方案,使这种在Web应用程序项目支持:weblogs.asp.net/scottgu/archive/2006/09/22/...
Zhaph本-杜吉德

6
确保将EnableUpdateable设置为false,否则视图将不会被预编译。<EnableUpdateable>假</ EnableUpdateable> <MvcBuildViews>真</ MvcBuildViews>(devcarl.posterous.com/...
卡尔霍伯格

55
为什么,为什么,为什么...没有用于构建视图的键盘快捷键?MS为什么?
dariol 2011年

2
这是添加到MVC工具中的解决方案。stackoverflow.com/a/2670792/878612
lko

50

您可以为此使用aspnet_compiler

C:\Windows\Microsoft.NET\Framework\v2.0.50727\aspnet_compiler -v /Virtual/Application/Path/Or/Path/In/IIS/Metabase -p C:\Path\To\Your\WebProject -f -errorstack C:\Where\To\Put\Compiled\Site

其中“ / Virtual / Application / Path / Or / Path / In / IIS / Metabase ”是这样的:“ / MyApp ”或“ / lm / w3svc2 / 1 / root /

MSDN上还有一个AspNetCompiler任务,展示了如何将aspnet_compiler与MSBuild集成:

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <Target Name="PrecompileWeb">
        <AspNetCompiler
            VirtualPath="/MyWebSite"
            PhysicalPath="c:\inetpub\wwwroot\MyWebSite\"
            TargetPath="c:\precompiledweb\MyWebSite\"
            Force="true"
            Debug="true"
        />
    </Target>
</Project>

5
这已经过时了,请参阅下面的自述文件摘录。
JarrettV

1
其他答案详细描述了项目任务,但aspnet_compiler部分仍然是正确的(和构建剂)。
mlhDev

26

另外,如果使用Resharper,则可以激活“解决方案范围分析”,它会检测aspx文件中可能存在的所有编译器错误。那就是我们要做的...


4
它确实适用于aspx文件,但解决方案范围的分析不包括ascx文件(用户控件)
mookid8000 2009年

3
我相信它可以在R#5中使用,但是对于大型项目而言,这是一个巨大的资源消耗(即使在我的16GB家用计算机上也不值得使用)。
安德鲁(Andrew)2010年

3
@Andrew / @ mookid8000-R#还将捕获编译器不会捕获的错误,例如缺少/不正确的视图和操作。R#会使您的PC速度变慢(我发现在具有4GB内存和超线程CPU的大型项目中,它会很好),但是我很容易就把时间花在等待它上,而最终我的操作减少了作为R#的代码提供了更高级别的操作,这些操作将我要手动完成同一任务所需执行的许多步骤组合在一起。您的项目一定很大!
德鲁·诺阿克斯

5
对于大型项目,“降低PC速度”是一种轻描淡写的说法。我的构建机器具有16GB的RAM和8个内核(2个Xeon),并且只是CRAWLS。我觉得R#并不是针对我们这样规模的项目而制作的……例如,我们的解决方案有约30个项目,数百万个LOC和数百个视图。我喜欢R#应用于较小的项目(例如,几个项目且视图不超过50个),但是对于大项目,我们总是必须将其关闭。
发出哔哔声

1
这可能有效,但请逃之!!我以为我的解决方案很小,却从未完成“分析”并吃掉我所有的RAM和CPU来解决这个问题。花了我15分钟才能恢复。
2014年

11

下一个版本的ASP.NET MVC(在一月左右发布)应该具有编译视图的MSBuild任务,因此您可能要等待。

查看公告



6

构建>运行代码分析

热键:Alt+F11

帮助我捕获Razor错误。


2
我赞成这个答案,因为热键确实暴露了Razor错误。但是,我随后注意到,只有在IDE中打开.cshtml文件时,它似乎才起作用。
Michael12345 '17

1

使用Visual Studio的Productivity Power Tools免费)扩展会有所帮助。具体来说,Solution Error Visualizer功能。使用它,可以在解决方案资源管理器中(在发现错误的源文件中)以可视方式标记编译错误。但是由于某种原因,此功能无法与代码中其他任何地方的其他错误一起使用。

使用MVC视图时,任何编译时错误仍将在其各自的.cs文件中用红色下划线标出,但表示这些错误不会在解决方案资源管理器中向上传播(决不会,甚至不会在包含的源文件中)。

感谢您BlueClouds纠正我以前的说法。

我刚刚在扩展程序的github项目上将此报告为问题


1
我尝试了生产力电动工具。但是不像这里所说的那样。剃刀视图中有错误,但构建成功。视图未在红色或解决方案浏览器树中的任何位置标记或加下划线。
蓝云

2
@BlueClouds:您是对的。我创建了一个示例项目,并在视图中添加了编译时错误。扩展名将在红色的错误行下方加上下划线,但不会在解决方案资源管理器中向上传播错误。我正在纠正我在答案中所说的。将答案留在这里,因为它仍然会有所帮助,而实际上并不能有效地解决问题。
Veverke '17
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.