ASP.NET MVC – tworzymy własną metodę pomocniczą

W dzisiejszym wpisie skupię się na pokazaniu, w jaki sposób można stworzyć prostą metodę pomocniczą dla naszej aplikacji napisanej przy wykorzystaniu ASP.NET MVC.  W przykładzie, metoda będzie wyświetlać wszystkie elementy przekazane za pomocą listy do widoku, dodając do nich tekst „Welcome in” (przykład nieco abstrakcyjny, jednak bardzo dobrze przekazuje wiedzę potrzebną na tworzenie helperów w przyszłości). Aby stworzyć metodę pomocniczą, możemy wybrać jedno z dwóch podstawowych  podejść:

– wewnętrzna metoda pomocnicza

– zewnętrzna metoda pomocnicza

Najpierw skupię się na pierwszym podejściu, a więc wewnętrznym. Za pomocą znacznika @helper, możemy ją utworzyć w widoku:

@helper WelcomeInCountries(List<string> countries)
{
 <div>
 @foreach(var country in countries)
 {
 <p>Welcome in @country!!!</p>
 }
 </div>
}

@WelcomeInCountries(ViewBag.Countries)  //użycie utworzonej metody pomocniczej

Jak widać, zarówno stworzenie metody pomocniczej, jak i jej wykorzystanie jest banalnie proste. Niestety, takie podejście ma jedną podstawową wadę – tak utworzona metoda może być użyta tylko i wyłącznie w widoku, w którym została utworzona. Kolejną wadą jest to, że w momencie, gdy nasza metoda będzie zawierała skomplikowaną logikę, to będzie zajmować bardzo dużo miejsca, przez co widok na pewno stanie się mniej czytelny.

Załóżmy więc, że chcemy odseparować taką metodę od widoku. Należy stworzyć osobną klasę i nazwać ją np. CountryHelper. Warto pamiętać, że taka klasa musi być statyczna:

public static class CountryHelper
    {
        public static MvcHtmlString WelcomeInCountry(this HtmlHelper htmlHelper, List<string> countries)
        {
            var htmlBuilder = new TagBuilder("div");

            foreach (var country in countries)
            {
                var textBuilder = new TagBuilder("p");
                textBuilder.SetInnerText("Welcome in " + country);
                htmlBuilder.InnerHtml += textBuilder.ToString();
            }

            return MvcHtmlString.Create(htmlBuilder.ToString());
        }
    }

Natomiast użycie jest równie proste, co w przypadku metody pomocniczej wewnętrznej:

@Html.WelcomeInCountry((List<string>)ViewBag.Countries) 

Tak przygotowaną metodę można użyć z każdego widoku w naszej aplikacji. Pozostaje pytanie – kiedy używać wewnętrznych, a kiedy zewnętrznych metod? Ja podchodzę do tego w sposób bardzo konserwatywny, czyli używam tylko i wyłącznie metod zewnętrznych, natomiast w wielu miejscach spotkałem się z użyciem metod wewnętrznych wtedy i tylko wtedy, gdy mamy pewność, że metoda będzie używana tylko i wyłącznie w jednym widoku w aplikacji, natomiast metoda zewnętrzna wtedy, gdy podejrzewamy, że przyda się w kilku różnych widokach. Z doświadczenia jednak wiem, że coś co założyliśmy na początku, często nie pokrywa się z tym, co osiągniemy po zaimplementowaniu 🙂

A jakie jest Wasze zdanie na ten temat?

4 uwagi do wpisu “ASP.NET MVC – tworzymy własną metodę pomocniczą

  1. Ciekawą alternatywą dla pisania Helperów jest dziedziczenie po ViewPage.
    Dzięki temu można dokładać nowe właściwości widoczne w widokach, które to pozwalają lepiej organizować metody które generują elementy widoku.
    Jednak jest to zabawka do projektów gdzie Helperów jest na tyle dużo że trzeba organizować – jak do dzisiaj zrobiłem to tylko jako proof of concept.
    Może powinienem o tym popełnić wpis na blogu 😉

    1. Nigdy nie spotkałem się z takim podejściem, więc jak najbardziej czekam na wpis 🙂 powiem Ci tak – jak na razie, nawet w gigantycznym projekcie nie było problemów z ogarnięciem helperów, dlatego jeszcze nie bawiłem się w szukanie alternatyw.

Zostaw komentarz

Wprowadź swoje dane lub kliknij jedną z tych ikon, aby się zalogować:

Logo WordPress.com

Komentujesz korzystając z konta WordPress.com. Wyloguj /  Zmień )

Zdjęcie na Google+

Komentujesz korzystając z konta Google+. Wyloguj /  Zmień )

Zdjęcie z Twittera

Komentujesz korzystając z konta Twitter. Wyloguj /  Zmień )

Zdjęcie na Facebooku

Komentujesz korzystając z konta Facebook. Wyloguj /  Zmień )

Connecting to %s