T4MVC: ASP.NET MVC stringmentesen

Az ASP.NET MVC egyik kellemetlensége, hogy alapértelmezés szerint sok helyen stringekkel hivatkozunk a controllerekre, actionökre és view-kra. Aki valaha készített már ilyen projektet, az biztosan írt már az alábbihoz hasonló sort egy actionbe:

  return View( "Index" );

vagy épp egy view-ba:

  @Html.ActionLink( "Bejelentkezés", "Login" )

A szépséghibát a stringek jelentik, ugyanis ha ott hibázunk, az csak futási időben derül ki.

Ezen segít a T4MVC projekt, amit legegyszerűbben NuGet csomagként illeszthetünk be az alkalmazásunkba:

t4mvc-nuget

Ha már vannak a projektünkben controllerek, akkor ne lepődjünk meg, hogy a NuGet telepítő egy kicsit átírja őket:

t4mvc-warnings

Sőt kapunk néhány extra fájlt is a projektünkhöz:

t4mvc-files

Cserébe ezek után már típusosan hivatkozhatunk a nézetekre:

  return View( Views.Index );

az actionökre:

  @Html.ActionLink( "Bejelentkezés", MVC.Home.Login() )

és még sok minden másra, amiről bővebben a dokumentációból tájékozódhatunk.

Mivel a háttérben T4 template-ek alapján történik kódgenerálás, felmerülhet a kérdés, hogy mi történik, ha például felveszünk egy új actiont? Azt fogjuk tapasztalni, hogy simán hivatkozhatunk rá view-ból, még az IntelliSense is fel fogja kínálni, csak éppen futási időben fog elszállni ezzel a hibával (itt azért egy pillanatra elgondolkozhatunk, hogy vajon nem épp ezt akartuk-e elkerülni):

T4MVC was called incorrectly. You may need to force it to regenerate by right clicking on T4MVC.tt and choosing Run Custom Tool

Szerencsére nagyon beszédes hibaüzenet, és ha követjük, valóban meg is oldódik a probléma. Ha még ezzel sem szeretnénk foglalkozni, akkor használhatjuk az AutoT4MVC bővítményt, amely figyeli, hogy módosulnak-e a fájljaink, és szükség esetén automatikusan újrafuttatja a kód generátort.

 

Technorati-címkék: ,

6 thoughts on “T4MVC: ASP.NET MVC stringmentesen

  1. apr

    Hát…
    Megdöbbentően túlbonyolít egy egyszerű és jól használható beépített megoldást. “Szimpatikus” hogy átírja a kontrollereket, feltételezem a nuget package uninstallkor szépen vissza is alakít mindent🙂
    Illetve van ennek bármi értelme a ViewBag és hasonlók világában?

    1. Balássy György Szerző

      A generált kód tényleg feleslegesen bonyolultnak tűnik, de én nem bánom, ha ez az ára annak, hogy fordítási időben derüljenek ki a hibák. Én még nem láttam olyan NuGet package-et, ami uninstallkor átírná a kódomat, de talán jobb is.

  2. Gábor Fazekas

    Az egész “stringes” probléma ott kezdődik, hogy valós helyzetben az ActionLink egy túlerőltetett és túlbonyított valami. pl:
    @Html.ActionLink(“LinkText”, “Action”, “Controller”, null, new { @class = “btn”, id = “btnID” })
    Egyáltalán nem rövidebb mintha az ember bepötyögne egy a href=”~/” – et , és itt a fenti példában az esetleges beírandó online styleokra még nem is tértem ki.

  3. apr

    Sok mvc-s nuget package módosít fájlokat: beleírnak a webconfig-ba, app_start-ba új fájlt raknak (elmah, miniprofiler stb.). És bizony, ha egy bonyolultabb web.config-gal találkoznak tönkre is teszik. Az ilyen (profibb) package-ok általában eltávolításkor megpróbáják a kódjaikat is leszedni, általában sikerül, de már volt, hogy a verziókövetőhöz kellett fordulni hogy a hátrahagyott szemetet megtaláljam.

    Azért (is) tervezték (szerintem) stringekkel a RenderPartial, RenderAction stb.-t, mert így “felül lehet írni” a view-kat is. Például van egy közös layout-ja minden view-nak, és abban van egy renderpartial ami a shared-ban lévő partial view-t rendereli. Ha ugyanezt a partial view-t módosítom és ugyanolyan néven, átrakom egy konkrét view mellé, akkor a konkrét view már azt fogja használni a shared-ben lévő helyett.

    “Értelemszerűen” ilyen példákat nem fogunk a task list, todo és hasonló minatalkalmazásokban találni…🙂

Vélemény, hozzászólás?

Adatok megadása vagy bejelentkezés valamelyik ikonnal:

WordPress.com Logo

Hozzászólhat a WordPress.com felhasználói fiók használatával. Kilépés / Módosítás )

Twitter kép

Hozzászólhat a Twitter felhasználói fiók használatával. Kilépés / Módosítás )

Facebook kép

Hozzászólhat a Facebook felhasználói fiók használatával. Kilépés / Módosítás )

Google+ kép

Hozzászólhat a Google+ felhasználói fiók használatával. Kilépés / Módosítás )

Kapcsolódás: %s