VS2013无法编译ASP.NET MVC5视图。

19

我的Visual Studio Ultimate 2013 更新4无法编译ASP.NET MVC 5视图。

虽然编译始终成功,但是有时会在视图上发现编译错误。视图上的智能感知也时好时坏。我想说,在VS2012中它的工作效果要好得多(我没有在那个版本上做太多MVC)。

我尝试将<MvcBuildViews>true</MvcBuildViews>添加到.csproj文件中,这在VS2010中往往有效,但现在不起作用了。

有什么想法是什么可能导致问题?

更新:我正在寻找查看视图错误的方法,就像在之前的VS版本中一样。


你使用 Resharper 吗? - Ofiris
1
RazorGenerator在编译视图方面要好得多。我会考虑切换到它:https://visualstudiogallery.msdn.microsoft.com/1f6ec6ff-e89b-4c47-8e79-d2d68df894ec和NUGET: https://www.nuget.org/packages/RazorGenerator.Mvc/ - Mathew Thompson
2个回答

33

在解决方案资源管理器中右键单击您的Web项目。点击卸载项目。再次右键单击该项目并点击编辑<projname>.csproj

确保您有这个元素(如果不存在,则添加它)。

<Project>
  <PropertyGroup>
    <MvcBuildViews>true</MvcBuildViews>
  </PropertyGroup>
</Project>

向下滚动到底部,您应该会看到一些注释:“要修改构建过程,请在下面的一个目标中添加您的任务并取消注释。” 在此下方添加以下标记:

<Target Name="MvcBuildViews" AfterTargets="AfterBuild" Condition="'$(MvcBuildViews)'=='true'">
    <ItemGroup>
      <ExtraWebConfigs Include="$(BaseIntermediateOutputPath)\**\web.config" />
      <ExtraPackageTmp Include="$([System.IO.Directory]::GetDirectories(&quot;$(BaseIntermediateOutputPath)&quot;, &quot;PackageTmp&quot;, System.IO.SearchOption.AllDirectories))" />
    </ItemGroup>
    <Delete Files="@(ExtraWebConfigs)" />
    <RemoveDir Directories="@(ExtraPackageTmp)" />
    <AspNetCompiler VirtualPath="temp" PhysicalPath="$(WebProjectOutputDir)" />
  </Target>

如果您没有看到我提到的评论,则上述代码应该有一个父级根<Project>节点。

关闭.csproj文件,然后右键单击解决方案资源管理器中的项目,然后单击重新加载项目

这将将您的视图添加到编译步骤中,并且如果发现错误,将停止构建。我发现这是一件好事,因为如果不这样做,有时我在错误列表中不会注意到错误,直到部署了我的站点,然后手动处理它们。请注意,这将增加一些时间到您的构建步骤中,显著减慢它的速度。根据您想要实现的目标,您可能希望有选择地启用/禁用它以实现快速构建->测试工作流程。

本答案的灵感来自于Chris Hyne对MVCBuildViews无法正常工作Razor视图是否可以编译的回答。


这只是在构建后编译视图,并显示生成的 C# 文件中的错误。但我需要的是视图中的编译错误。 - vtortola
@vtortola,我不确定我理解你的意思。使用此配置,它将停止您的构建,显示编译错误列表,然后您可以双击它们以转到相应的视图并处理它们。如果这不是您想要的,请说明得更清楚一些? - mason
等等,现在它可以工作了。我收到了一个关于不存在模型的错误,有两个错误,一个将我带到视图,另一个则只是生成了一个 C# 文件。谢谢! - vtortola
这在使用VS2015和MVC5仍然有效吗?对我来说似乎不起作用。我的解决方法是通过启用发布期间的预编译,在构建服务器上编译视图,但这似乎会阻止EmbeddedResourceVirtualPathProvider工作,而该工具对于此项目是必需的。我真的想为cshtml进行一些错误检查,但目前似乎不可能。 - Russell Horwood

15

您的项目是否包括目标并钩入构建后事件?尝试从命令行运行msbuild WebApplication1.csproj /t:MvcBuildViews,它将检查您是否同时设置了默认属性和目标。

<PropertyGroup>
    <MvcBuildViews>true</MvcBuildViews>
</PropertyGroup>

<Target Name="MvcBuildViews" AfterTargets="AfterBuild" Condition="'$(MvcBuildViews)'=='true'">
    <AspNetCompiler VirtualPath="temp" PhysicalPath="$(WebProjectOutputDir)" />
</Target>

尝试在VS2013U4内创建一个空白的MVC项目,然后将csproj文件与您的进行比较。请注意保留HTML标签,但不需要解释该术语。

在VS2013 MVC5应用程序中,MvcBuildViews设置为false。感谢提供的信息。现在已经打开了,我可以看到要查找的位置 - 尽管它是生成的MVC文件,但名称指示了哪个Razor视图。在命名空间重命名后,必须浏览所有视图,这真是一场噩梦。 - Andez

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接