Zo, de zomervakantie is weer over. Iedereen is weer aan het werk of zit nog in een ontkennende fase.
Dit keer wil ik jullie deelgenoot maken van de grootste prestatie-verbetering binnen ons project. Het stelt op zich niks voor (een boolean omzetten) maar deze fix scheelt ons veel (her-)testwerk.
Brekende wijzigingen in MVC Viewmodellen tov. Views worden namelijk standaard niet door de compiler herkent. Als een (kapotte) aanroep van een property uit een viewmodel niet meer aansluit op de werkelijkheid (de property is weggehaald of hernoemd) dan kom je daar pas bij het testen op de testserver of productie achter. De compiler negeert deze afwijkingen volkomen.
Een demo…
Maak een MVC3 (internet applicatie template). Het mag ook een MVC2 applicatie zijn.
Creeer daarna een viewmodel:
public class MyViewModel { public int MyFirstProperty { get; set; } public int MySecondProperty { get; set; } }
Deze bevat nu twee properties. Hercompileer het project om het model beschikbaar te maken voor de Create View wizard.
Nu gaan we een View op de home controller aanmaken (Create view). Eerst wordt de create.cshtml gegeneerd in de \views\Home map. Let er op dat deze de Create scaffold template toepast:
En nu moeten we op de Home controller de Create methode toevoegen:
public class HomeController : Controller { ... public ActionResult Create() { MyViewModel myViewModel = new MyViewModel(); myViewModel.MyFirstProperty = 42; myViewModel.MySecondProperty = 43; return View(myViewModel); } }
Test nu of alles aan elkaar gekoppeld is. Navigeer naar de /home/Create actie:
Ok. De pagina werkt, de twee waarden zijn al vooraf ingevuld.
Sluit nu de applicatie om terug naar VS2010 te gaan. Nu gaan we in het model een property hernoemen.
public class MyViewModel { public int MyFirstProperty { get; set; } // renamed only here in the model public int MyThirdProperty { get; set; } }
Hercompileer eens. Dan volgt er deze foutmelding:
Error 1 ‘MvcApplication2.Models.MyViewModel’ does not contain a definition for ‘MySecondProperty’ and no extension method ‘MySecondProperty’ accepting a first argument of type ‘MvcApplication2.Models.MyViewModel’ could be found (are you missing a using directive or an assembly reference?) d:\Projects\testpath\MvcApplication2\MvcApplication2\Controllers\HomeController.cs
Maar helaas is dit alleen een melding over de aanroep in de Home controller! Maar in de view staat nog enkele verkeerde aanroepen, die worden genegeerd. Want als de view nogmaals aangeroepen wordt:
We krijgen dus een vette foutmelding, runtime! Dus de viewengine code wordt niet gecontroleerd door de compiler.
Dit is wel op te lossen! Hiervoor is een eenvoudige oplossing…
Open de project properties (Edit ProjectFile):
Pas hier de optie MvcBuildViews aan. Pas de waarde aan door deze op ‘true’ te zetten.
Herlaadt het project…
En hercompileer het project…
En nu komen de fouten in de view wel naar voren:
Error 1 ‘MvcApplication2.Models.MyViewModel‘ does not contain a definition for ‘MySecondProperty’ and no extension method ‘MySecondProperty’ accepting a first argument of type ‘MvcApplication2.Models.MyViewModel’ could be found (are you missing a using directive or an assembly reference?)
d:\Projects\testpath\MvcApplication2\MvcApplication2\Views\Home\Create.cshtml
Etc…
De project optie MvcBuildViews forceert dat VS2010 de view al hercompileert. Dit betekent wel dat het compileren iets langer gaat duren maar zorgt tevens voor minder testwerk en een betere uitrol.