CVC-MVCBuildViews无法正常工作

因此,我在MVC 3 RTM应用程序上编辑了我的csproj文件,以设置以下属性:

<MvcBuildViews>true</MvcBuildViews>

这将导致我的视图在构建过程中被编译,并且如果我的视图被破坏,将导致构建错误。 这是我所做的唯一更改,但是,当我尝试构建应用程序时,出现以下错误:

使用超出应用程序级别注册为allowDefinition ='MachineToApplication'的节是错误的。 此错误可能是由于未在IIS中将虚拟目录配置为应用程序引起的。

如果我改回false,项目将编译并成功运行,

以下是在csproj文件中配置的构建任务(这些任务从未进行过手动编辑,它们是由Visual Studio 2010添加的)

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

我在这里想念什么吗? 如何在构建时正确配置MVC 3 / Visual Studio 2010以验证我的视图?

Scott asked 2020-02-18T10:32:12Z
5个解决方案
54 votes

几天前,我遇到了这个问题,并通过删除obj / Debug文件夹来解决此问题。 清理项目也可以。 不过,我不知道问题的原因。

有关更永久的解决方案,请参见Joe Cartano的答案。

Nick Canzoneri answered 2020-02-18T10:32:33Z
37 votes

当obj文件夹中有Web项目输出(模板化的web.config或临时发布文件)时,会发生此问题。 使用的ASP.NET编译器不够智能,无法忽略obj文件夹中的内容,因此它会引发错误。

另一个解决方法是在调用<AspNetCompiler>之前取消发布输出。 打开您的.csproj并更改此设置:

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

对此:

<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>

这将删除\ obj下的所有web.configs以及\ obj下的所有PackageTmp文件夹。

更新:

更好的是,基于[https://stackoverflow.com/a/48582282/8037],您可以完全排除obj文件夹。 显然<AspNetCompiler />任务没有排除参数,但是如果切换到直接调用aspnet_compiler .exe,则可以像这样排除obj:

<Target Name="MvcBuildViews" AfterTargets="AfterBuild" Condition="'$(MvcBuildViews)'=='true'">
    <Exec Command="$(MSBuildFrameworkToolsPath)aspnet_compiler.exe -v temp -p $(WebProjectOutputDir) -x $(BaseIntermediateOutputPath)"/>
</Target>
Chris Hynes answered 2020-02-18T10:33:15Z
22 votes

出现此错误时,您的obj文件夹中是否还有另一个web.config文件? 如果您使用的是MSDeploy,则可能会有所帮助:[http://blogs.msdn.com/b/webdevtools/archive/2010/05/14/the-aspnet-compiler-build-task-in-visual-studio-2010- asp-net-mvc-2-projects.aspx,],否则,可能是您正在运行的某些工具正在生成另一个web.config。

Joe Cartano answered 2020-02-18T10:33:36Z
3 votes

这对我有用。 (可选)您可以使用配置指定条件。

<Target Name="MvcBuildViews" AfterTargets="AfterBuild" Condition="'$(MvcBuildViews)'=='true'">
  <AspNetCompiler VirtualPath="temp" PhysicalPath="$(WebProjectOutputDir)" />
</Target>
<Target Name="AfterBuild" Condition="'$(Configuration)'!='Debug'">
  <RemoveDir Directories="$(BaseIntermediateOutputPath)" />
</Target>
arni answered 2020-02-18T10:33:56Z
0 votes

以下MSDN博客很好地解释了即使MvcBuildViews设置为“ true”,此期的编译时视图检查问题:

[https://blogs.msdn.microsoft.com/jimlamb/2010/04/20/turn-on-compile-time-view-checking-for-asp-net-mvc-projects-in-tfs-build-2010 /]

您可以通过直接编辑.csproj文件来进行修复:

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

 <Target Name="BuildViews" Condition="'$(MvcBuildViews)'=='true'" AfterTargets="Build">
   <Message Importance="normal" Text="Precompiling views" />
   <AspNetCompiler VirtualPath="temp" PhysicalPath="$(WebProjectOutputDir)" />
 </Target>
David Rokni answered 2020-02-18T10:34:25Z
translate from https://stackoverflow.com:/questions/4725387/mvcbuildviews-not-working-correctly