MVC nézetek fordítása hibamentesen

A Visual Studio és az ASP.NET alapértelmezés szerint nem fordítási időben, hanem futási időben dolgozza fel a MVC nézetekben lévő kódot. Ennek természetesen az az eredménye, hogy ha ott valamilyen hibát vétünk, akkor az csak futási időben fog kiderülni.

Szerencsére van arra lehetőség, hogy rávegyük a Studiot, fordítsa le a nézeteket is a build folyamat részeként. Ehhez nyissuk meg az MVC projekthez tartozó projekt fájlt (.csproj), és írjuk át az MvcBuildViews elem értékét false-ról true-ra:

<MvcBuildViews>true</MvcBuildViews>

Ez meg is oldja a kezdeti problémát, ám gyakran bevezet egy újabbat. Időnként fordításkor vagy a webalkalmazás publikálásakor az alábbi hibaüzenetet kaphatjuk:

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.

A legborzasztóbb ebben az üzenetben, hogy nem csak az nem derül ki belőle, hogy hol a hiba, hanem az sem, hogy hogyan lehet kijavítani.

A megoldás az obj mappa törlése fordítás előtt, és a hibaüzenet máris megszűnik. Gondoltad volna a hibaüzenet alapján?

Aki nem szeretné mindig kézzel törölgetni ezt a mappát, az persze megteheti a build folyamat első lépéseként is. Szerencsére az MSBuild ad nekünk egy BaseIntermediateOutputPath nevű változót, ami pont az obj mappára mutat, sőt még egy RemoveDir nevű task is van hozzá, így már csak össze kell pakolni őket. Megint nyissuk meg a .csproj fájlt, és vegyünk fel egy RemoveDir elemet a BeforeBuild target-hez:

<Target Name="BeforeBuild">
    <RemoveDir Directories="$(BaseIntermediateOutputPath)" />
</Target>

Akinek esetleg a bin mappával van személyes nézeteltérése, az esetleg használhatja a BaseOutputPath változót.

 

Technorati-címkék: ,,
Advertisements

3 thoughts on “MVC nézetek fordítása hibamentesen

  1. apr

    A probléma igazi gyökere hogy az obj mappát az asp.net precompiler (hibásan egyébként) az asp.net site részének tekinti. Az MvcBuildViews beállítás is a precompilert használja (azért olyan tetű lassú, tulajdonképen használhatatlan, egy hello word alkalmazáshoz azért még elmegy).

    A removedir trükk sajnos nem mindig működik (főleg publikáláskor, ha precompile-t beállítjuk).

    A biztos megoldás ha az obj directrory-t átírányítjuk a projekt fájlban, hogy ne legyen a site része, valahogy így:
    D:\Temp\Projekt neve\obj\
    $(BaseIntermediateOutputPath)$(Configuration)\

    A végső megoldás pedig az MvcBuiidView helyett a razorgenerator-t használni.

    Reply
  2. apr

    [BaseIntermediateOutputPath]D:\Temp\Projekt neve\obj\[/BaseIntermediateOutputPath]
    [IntermediateOutputPath]$(BaseIntermediateOutputPath)$(Configuration)\[/IntermediateOutputPath]

    Reply

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google+ photo

You are commenting using your Google+ account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

w

Connecting to %s