6

在我的 Asp.Net MVC 4 项目中,我在 .csproj 文件中设置了构建视图<MvcBuildViews>true</MvcBuildViews>。问题是构建项目时出现错误:

It is an error to use a section registered as allowDefinition='MachineToApplication' beyond application level. This error can be caused by a virtual directory not being configured as an application in IIS.

我试图删除 obj 文件夹,但错误不断出现。该错误表明问题出在身份验证标记行中:

<system.web>
    <authentication mode="Forms">
      <forms loginUrl="~/Account/Login" timeout="2880" />
    </authentication>

通常,我可以通过运行应用程序(我收到错误)、构建应用程序然后再次运行来运行应用程序。

4

2 回答 2

10

执行@matrixugly 建议的操作将解决问题,但也会导致编译时视图检查也停止工作。我假设您仍然想在编译时错误检查您的视图?如果是这种情况,请在下面进行更好的修复。

为了理解为什么这些解决方案有效,我们首先要知道问题是如何产生的:

  1. 开发人员希望在编译时检查视图,因此他们将MvcBuildViews=true.
  2. 应用程序构建良好,直到他们发布项目。
  3. 随后尝试构建项目会导致编译时错误:It is an error to use a section registered as allowDefinition='MachineToApplication' beyond application level. This error can be caused by a virtual directory not being configured as an application in IIS.

那么是什么导致了这个问题呢?当项目发布时,编译器默认使用它<project-dir>\obj\来放置将使用的源文件的副本。不幸的是,这些文件不会在发布完成后自动删除。下次开发人员用 编译项目时MvcBuildViews=true,会报错,因为 aspnet 编译器obj\在编译期间包含该文件夹,因为它位于该<project-dir>文件夹下。

那么我们如何解决这个问题呢?好吧,你有四个选择:

  1. 设置MvcBuildViews=false。我真的不认为这是一个解决方案,所以让我们继续。
  2. 删除<project-dir>\obj\. 有效,但可能很麻烦,因为必须在每次发布后完成。
  3. <BaseIntermediateOutputPath>通过使用项目配置文件中的属性来更改发布用作中间目录的路径。

    示例(参考:此链接):

    <BaseIntermediateOutputPath> [SomeKnownLocationIHaveAccessTo] </BaseIntermediateOutputPath>

  4. 在您的项目配置文件中添加一个新部分,该部分会在构建时为您删除有问题的文件(参考Microsoft Connect)。我什至让你很容易,只需复制和粘贴:

    <PropertyGroup>
    <_EnableCleanOnBuildForMvcViews Condition=" '$(_EnableCleanOnBuildForMvcViews)'=='' ">true</_EnableCleanOnBuildForMvcViews>
    </PropertyGroup>
    <Target Name="CleanupForBuildMvcViews" Condition=" '$(_EnableCleanOnBuildForMvcViews)'=='true' and '$(MVCBuildViews)'=='true' " BeforeTargets="MvcBuildViews">
    <ItemGroup>
        <_TempWebConfigToDelete Include="$(BaseIntermediateOutputPath)**\Package\**\*" />
        <_TempWebConfigToDelete Include="$(BaseIntermediateOutputPath)**\TransformWebConfig\**\*" />
        <_TempWebConfigToDelete Include="$(BaseIntermediateOutputPath)**\CSAutoParameterize\**\*" />
        <_TempWebConfigToDelete Include="$(BaseIntermediateOutputPath)**\TempPE\**\*" />
    </ItemGroup>
    
    <Delete Files="@(_TempWebConfigToDelete)"/>
    </Target>
    

我的建议是使用选项 3 或 4。

NB 对于那些从未编辑过他们的项目文件的人,您无法在加载时对其进行编辑。必须首先通过右键单击它并选择 来卸载它Unload Project。然后,您可以右键单击项目并编辑项目文件。或者,您可以在 Visual Studio 之外编辑该文件。

于 2015-05-07T17:50:06.773 回答
0

在启用 MvcBuildViews 验证我的 Razor 语法后尝试发布我的 Web 应用程序时,我遇到了完全相同的问题

我在我的网络配置中找到了这段代码

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

尝试将其注释掉,这样编译器的行为就不会改变

  <!--<Target Name="MvcBuildViews" AfterTargets="AfterBuild" Condition="'$(MvcBuildViews)'=='true'">
<AspNetCompiler VirtualPath="temp" PhysicalPath="$(WebProjectOutputDir)" />
</Target>-->
于 2014-06-06T14:40:06.507 回答