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>です。

では、これを修正するにはどうすればよいでしょうか。次の 4 つのオプションがあります。

  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 のいずれかを使用することです。

注: プロジェクト ファイルを編集したことがない場合は、ロード中に編集することはできません。最初に、右クリックして を選択してアンロードする必要がありUnload Projectます。その後、プロジェクトを右クリックして、プロジェクト ファイルを編集できます。または、Visual Studio の外部でファイルを編集することもできます。

于 2015-05-07T17:50:06.773 に答える
0

MvcBuildViews を有効にして Razor 構文を検証した後、Web アプリケーションを公開しようとすると、まったく同じ問題が発生しました。

このコードは私の 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 に答える