Aplikacja internetowa czy zwykła strona internetowa nie może obyć się bez określonego tytułu strony. Poniżej zamieszczam prosty przykład jak można selektywnie określać tytuł strony z poziomu kontrolera. Extension method Standardowe wyświetlenie treści strony odbywa się poprzez wywołanie metody View w metodzie akcji kontrolera.
public ActionResult Create()
{
var model = new SomeModel();
return View("Create", model);
}
Metoda View zwraca obiekt ViewResult. Zdefiniujmy zatem metodę rozszerzającą dla tego obiektu o metodę o dźwięcznej nazwie WithTitle. W tym celu dodajemy nową klasę do projektu i nazywamy ją ViewResultExtensions.
public static class ViewResultExtensions
{
public static ViewResult WithTitle(this ViewResult vr, string title)
{
vr.ViewData["PageTitle"] = title;
return vr;
}
}
Dzięki temu możemy zmodyfikować naszą akcję Create następująco:Nasz model SomeModel pozostawiamy nietknięty, a mimo to mamy przekazany tytuł strony do widoku.
Wyświetlenie tytułu
Musimy jeszcze przekazany tytuł strony wyświetlić. Tutaj także posłużymy się metodą rozszerzoną, ale dla obiektu ViewMasterPage.
1: public static string PageTitle(this ViewMasterPage vp)
2: {
3: var title = vp.ViewData["PageTitle"] as string;
4: return title.Default("Brak parametru PageTitle");
5: }
Metoda Default została przeze mnie pokazana w poście prezentującym kilka przydatnych Extension Methods. Teraz w naszym pliku szablonu możemy wstawić nasz tytuł. W sekcji head umieszczamy poniższą linijkę:
1: <%=Html.Title(this.PageTitle()) %>
Uzupełniając powyższy kawałek kodu, poniżej metoda rozszerzająca HtmlHelper o metodę Title:
1: public static string Title(this HtmlHelper h, string text)
2: {
3: TagBuilder tag = new TagBuilder("title");
4: tag.SetInnerText(text);
5: return tag.ToString(TagRenderMode.Normal);
6: }
Na zakończenie
Oczywiście jest to dosyć proste rozwiązanie, ale w sumie sprawdza się w praktyce. Na podobnej zasadzie można przekazywać do widoku inne dane, które są niezależne od aktualnego kontekstu. Dla przykładu pisząc aplikację typu "blog" przydadzą się dodatkowo takie meta dane jak: keyword, description, itd, itp. Można zdefiniować osobny obiekt, który będzie zawierał wszystkie potrzebne właściwości, aby nie wrzucać do kolekcji ViewData pojedynczych wartości.