Dlaczego T4MVC?
W aplikacji ASP.NET MVC w wielu miejscach wykorzystujemy stringi do określenia takich rzeczy, jak: nazwa kontrolera, nazwa akcji, nazwa widoku, ścieżka do pliku i wiele innych. Osobiście nie lubię używania napisów w kodzie aplikacji. Trudno znaleźć później użycia danego napisu – przez to, gdy zmieniamy na przykład nazwę akcji, bardzo łatwo o pominięcie jakiegoś linku w aplikacji, a to z kolei powoduje, że psujemy jej działanie. Do tego dochodzą problemy z literówkami czy brak podpowiadania dostępnych opcji (tutaj na przykład Resharper to ułatwia i podpowiada).
Zamiast bezpośrednich napisów w swoich aplikacjach używam albo klas ze stałymi dla napisów wewnętrznych aplikacji, które są używane tylko w kodzie, albo zasobów (Resources) dla napisów, które są pokazywane użytkownikowi.
W przypadku ASP.NET MVC można samemu ręcznie tworzyć klasy ze stałymi dla nazw kontrolerów, akcji, widoków itp. Albo można skorzystać z czegoś gotowego. 🙂 Jako wielki fan szablonów T4 (mam nawet przygotowaną prezentację z tej tematyki) w swoich aplikacjach wykorzystuję już istniejący szablon, który generuje wszystko sam. Szablon można pobrać z Nugeta i nazywa się T4MVC (strona projektu).
Na githubie projektu znajduje się bogata dokumentacja pokazująca wszystkie dostępne z szablonu opcje. Ja natomiast w tym wpisie skupię się najbardziej istotnych elementach z szablonu, od których warto zacząć.
Instalacja oraz uruchamianie T4MVC
Instalacja T4MVC jest bardzo prosta. Wystarczy skorzystać z Nugeta i zainstalować pakiet T4MVC. Po instalacji pakietu, aby wygenerować wszystkie elementy, należy przejść do pliku T4MVC.tt w głównym katalogu projektu oraz go zapisać. Zapisanie pliku szablonu T4 powoduje jego wykonanie, czyli na ogół wygenerowanie kodu.
Niestety szablon nie wykonuje się automatycznie, dlatego po każdej zmianie w kodzie (np. po dodaniu nowego kontrolera, dodaniu akcji, zmianie czegoś w kodzie itp.) należy uruchomić szablon jeszcze raz. Możemy też skorzystać z jednego z dodatków do Visual Studio, które wykonują szablony przed buildem. Polecam jeden z dwóch:
- AutoT4 – do uruchamiania wszystkich szablonów w solution
- AutoT4MVC – dedykowany dodatek dla szablonu T4MVC, który uruchamia tylko ten szablon.
Napisy dla nazw kontrolerów oraz akcji
W pierwszej kolejności warto wyeliminować napisy dla nazw kontrolerów oraz nazw akcji. Poniżej znajduje się przykład przekierowania w kontrolerze do jakieś innej akcji, w starej wersji oraz nowej, wykorzystującej klasy wygenerowane przez szablon T4MVC.
public virtual ActionResult Action(int id) | |
{ | |
return Content(id.ToString()); | |
} | |
public virtual ActionResult RedirectToActionUsingString() | |
{ | |
return RedirectToAction("Action", "Home", new { id = 10 }); | |
} | |
public virtual ActionResult RedirectToActionUsingT4MVC() | |
{ | |
return RedirectToAction(MVC.Home.Action(10)); | |
} |
Jak widać powyżej, zamiast przekazywania nazwy kontrolera oraz nazwy akcji w formie stringów, możemy skorzystać z wygenerowanych klas. W tym przypadku korzystamy z klasy MVC, która ma pola dla wszystkich kontrolerów i później metody dla akcji. Dodatkowo możemy też w ładny sposób przekazywać parametry do nowej akcji.
Podobna sytuacja jest w widokach i generowaniu różnego rodzaju linków:
<ul class="nav navbar-nav"> | |
<li>@Html.ActionLink("Home", "Index", "Home")</li> | |
<li>@Html.ActionLink("About", MVC.Home.About())</li> | |
<li>@Html.ActionLink("Contact", MVC.Home.Contact())</li> | |
</ul> |
Mamy bardzo podobną składnię, jak w przypadku kodu w kontrolerze, i możemy zrezygnować ze stringów.
Nową składnię możemy również wykorzystać w definicji routingu:
public class RouteConfig | |
{ | |
public static void RegisterRoutes(RouteCollection routes) | |
{ | |
routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); | |
routes.MapRoute( | |
name: "IndexRoute", | |
url: "Index", | |
defaults: MVC.Home.Index() | |
); | |
routes.MapRoute( | |
name: "Default", | |
url: "{controller}/{action}/{id}", | |
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } | |
); | |
} | |
} |
Nazwy widoków
W aplikacji ASP.NET MVC czasami potrzebujemy w kodzie również nazw widoków, chociażby do wywołania widoków partial czy w sytuacji, gdy współdzielimy ten sam widok między różnymi akcjami – na przykład dla akcji dodania oraz edycji używamy tego samego widoku. W takich sytuacjach T4MVC również pozwoli nam wyeliminować użycie stringów w kodzie:
public virtual ActionResult UseViewNameAsString() | |
{ | |
ViewBag.ActionName = "UseViewNameAsString"; | |
return View("View"); | |
} | |
public virtual ActionResult UseViewNameUsingT4MVC() | |
{ | |
ViewBag.ActionName = ActionNames.UseViewNameUsingT4MVC; // MVC.Home.ActionNames.UseViewNameUsingT4MVC | |
return View(Views.View); | |
} |
Jak widać, możemy w prosty sposób wyciągnąć nazwę widoku stworzoną dla danego kontrolera czy nazwy wszystkich akcji.
Linki do plików
Kolejną fajną rzeczą, którą udostępnia T4MVC, to generowanie stałych dla różnego rodzaju plików w aplikacji, na przykład plików css, js, obrazków itp. Dzięki temu możemy wyeliminować kolejne napisy w plikach cshtml:
<div class="row"> | |
<div class="col-md-12"> | |
<img src="@Links.Content.Images.Visual_Studio_2013_Logo_svg_png" /> | |
</div> | |
</div> |
Podsumowanie
Jak widać powyżej, T4MVC znacznie ułatwia eliminację różnego rodzaju napisów w aplikacji ASP.NET MVC. Osobiście nie wyobrażam sobie projektu bez użycia tego szablonu. Pracując z różnymi zespołami, zauważyłem, że bardzo niewiele osób zna ten szablon (czy w ogóle szablony T4), a szkoda.
Gorąco zachęcam do zapoznania się z T4MVC i używania go w swoich projektach. Tradycyjnie na moim githubie jest projekt z demami.
A Ty używasz napisów w swoich aplikacjach? A może znasz już T4MVC lub używasz innego rozwiązania? Jeśli tak, podziel się tym w komentarzu!
Hej.
Też używam. Dla aplikacji MVC jest zarąbisty. Też polecam.
w core jest to w miarę poukładane przynajmniej w widokach