Проблема связана с промежуточными файлами, но есть и другое решение, заключающееся в очистке этих промежуточных файлов перед построением представлений.
Это решение было включено в некоторые версии VS, но я могу только сказать, что у меня была проблема в VS 2013 Update 5. (См. «Осторожно» ниже, это можно исправить в этом версия, но не работает только в моем конкретном нестандартном случае).
Я позаимствовал решение у Ошибка: allowDefinition = 'MachineToApplication' за пределами уровня приложения в Visual Studio Connect.
Решение состоит в том, чтобы включить эти строки в проект веб-приложения (файл .csproj
), который обрабатывает удаление промежуточных файлов с исходным кодом:
<!--Deal with http://connect.microsoft.com/VisualStudio/feedback/details/779737/error-allowdefinition-machinetoapplication-beyond-application-level,
we will need to clean up our temp folder before MVC project starts the pre-compile-->
<PropertyGroup>
<_EnableCleanOnBuildForMvcViews Condition=" '$(_EnableCleanOnBuildForMvcViews)'=='' ">true</_EnableCleanOnBuildForMvcViews>
</PropertyGroup>
<Target Name="CleanupForBuildMvcViews" Condition=" '$(_EnableCleanOnBuildForMvcViews)'=='true' and '$(MVCBuildViews)'=='true' " BeforeTargets="MvcBuildViews">
<ItemGroup>
<_PublishTempFolderNamesToCleanup Include="Database;TransformWebConfig;CSAutoParameterize;InsertAdditionalCS;ProfileTransformWebConfig;Package;AspnetCompileMerge" />
</ItemGroup>
<!--Force msbuild to expand all the wildcard characters so to get real file paths-->
<CreateItem Include="@(_PublishTempFolderNamesToCleanup->'$(BaseIntermediateOutputPath)**\%(identity)\**\*')">
<Output TaskParameter="Include" ItemName="_EvaluatedPublishTempFolderNamesToCleanup" />
</CreateItem>
<Delete Files="@(_EvaluatedPublishTempFolderNamesToCleanup)" />
</Target>
Осторожно: по какой-то причине, возможно, потому что я сам включил его в проект, моя цель сборки для построения представлений называлась "BuildViews"
, а не "MvcBuildViews"
, поэтому мне пришлось изменить BeforeTargets
атрибут соответственно. Я также упростил цель, удалив PropertyGroup
и упростив условие, например:
<Target Name="CleanupForBuildMvcViews" Condition="'$(MVCBuildViews)'=='true' " BeforeTargets="BuildViews">
<ItemGroup>
<_PublishTempFolderNamesToCleanup Include="Database;TransformWebConfig;CSAutoParameterize;InsertAdditionalCS;ProfileTransformWebConfig;Package;AspnetCompileMerge" />
</ItemGroup>
<!--Force msbuild to expand all the wildcard characters so to get real file paths-->
<CreateItem Include="@(_PublishTempFolderNamesToCleanup->'$(BaseIntermediateOutputPath)**\%(identity)\**\*')">
<Output TaskParameter="Include" ItemName="_EvaluatedPublishTempFolderNamesToCleanup" />
</CreateItem>
<Delete Files="@(_EvaluatedPublishTempFolderNamesToCleanup)" />
</Target>