2011-01-18 22 views
43

Así que editar mi archivo csproj en una aplicación MVC 3 RTM para establecer la siguiente propiedad:MVCBuildViews no funcionan correctamente

<MvcBuildViews>true</MvcBuildViews> 

Esto debería hacer que mis puntos de vista, que debe cumplir durante la construcción y forzar un error de compilación si mi vista está roto. Este es el único cambio que hice, sin embargo, cuando trato de instalar la aplicación, me sale el siguiente error:

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.

El proyecto se compila y se ejecuta correctamente si cambio de nuevo a falso,

La siguiente son las tareas de construcción configurados en el archivo csproj (estos nunca fueron editados manualmente, que se agregaron por 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> 

me estoy perdiendo algo aquí? ¿Cómo configuro correctamente MVC 3/Visual Studio 2010 para validar mis vistas en tiempo de compilación?

+0

Su web.config tiene una sección no válida definida en ella. Es lamentable que el mensaje de error no proporcione ningún detalle. ¿Tienes algo sospechoso en web.config? – marcind

Respuesta

49

he tenido este problema hace unos días y me fijo mediante la supresión de la carpeta obj/depuración.

Editar: Vea Joe Cartano's answer para una solución más permanente.

+0

Eso fue todo, gracias. No estoy seguro de por qué eso causa este error en particular, pero resolvió el problema. – Scott

+0

Sí, tampoco tengo idea. Probablemente un Clean también hubiera funcionado. –

+2

Intenté esto, pero lamentablemente no funcionó para mí. Voy a probar algunas otras soluciones a continuación con la esperanza de tener éxito. – MikeJ

0

trate de cambiar la línea que AspNetCompiler a esto:

<AspNetCompiler VirtualPath="temp" PhysicalPath="$(ProjectDir)\..\$(ProjectName)" /> 
+1

Desafortunadamente eso no tuvo ningún efecto ... – Scott

21

Cuando obtiene este error, ¿tiene otro archivo web.config en su carpeta obj? Si está utilizando MSDeploy esto podría ayudar: 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, si no, tal vez otro web.config está siendo generado por alguna herramienta que está ejecutando.

+7

SÍ, GRACIAS. Agregué esto a mi archivo .proj: ' .. \ bin' así que ahora la carpeta obj está en el nivel de solución, y los problemas de compilación se han ido. –

+1

Para guardar siguiendo el enlace, el elemento '' se puede colocar directamente debajo de '' en el archivo del proyecto. Puede ser más correcto nombrar su directorio temporal "obj" en lugar de "bin", pero realmente no importa. –

+0

@JohnBubriski si copia el código de su comentario, hay un problema raro de unicode (supongo) que hace que la etiqueta de apertura no coincida con la etiqueta de cierre, incluso si se ven idénticas. La etiqueta de cierre tiene un carácter invisible entre "a" y "t" en "Ruta" –

34

Este problema se produce cuando hay una salida de proyecto web (archivos web.config con plantilla o publicación temporal) en la carpeta obj. El compilador de ASP.NET utilizado no es lo suficientemente inteligente como para ignorar cosas en la carpeta obj, por lo que arroja errores en su lugar.

Otra solución es desarticular la salida de publicación justo antes de llamar al <AspNetCompiler>. Abra su .csproj y cambiar esta situación:

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

a esto:

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

que se eliminarán todos los web.configs bajo \ obj, así como todas las carpetas PackageTmp en \ obj.

+0

única solución que realmente funcionó - frente a 2013 mvc 5 – Santhos

+0

Esta solución funcionó también para mí. Ejecutando VS2013 y MVC5 –

+0

O si prefiere simplemente eliminar toda la carpeta obj \ Debug (u obj \ Release), simplemente agregue el siguiente unineador antes de :

2

Esto es lo que funcionó para mí. Opcionalmente, puede especificar una condición con la configuración.

<Target Name="MvcBuildViews" AfterTargets="AfterBuild" Condition="'$(MvcBuildViews)'=='true'"> 
    <AspNetCompiler VirtualPath="temp" PhysicalPath="$(WebProjectOutputDir)" /> 
</Target> 
<Target Name="AfterBuild" Condition="'$(Configuration)'!='Debug'"> 
    <RemoveDir Directories="$(BaseIntermediateOutputPath)" /> 
</Target> 
Cuestiones relacionadas