Ruting, helpery
1. Wprowadzenie
a. Ruting
Ruting w ASP.NET MVC służy do interpretacji adresów URL żądań. Żądanie na serwer www trafia po nazwie domeny lub ip hosta, który go identyfikuje w sieci, czyli np.:
• localhost:9999 • iisi.pcz.pl • 127.0.0.1:9999
Dalsza cześć adresu jest już informacją dla samego serwera www np.: • localhost:9999/home/index
• localhost:9999/dom/add?nr=11 • localhost:9999?nr=11
W przypadku zwykłego serwera www adres wskazuje ścieżkę w katalogach serwera na plik, który ma odesłać np. dla /home/index serwer, będzie się starał zajrzeć do katalogu home i odesłać z niego plik index.html. Jeśli index to katalog to zwróci wykaz zawartości katalogu.
W przypadku MVC domyślne zachowanie serwera zostało nadpisane przez aplikację www. Całość trafia bezpośrednio do aplikacji www jako interpretowany przez nią parametr. Domyślnie w MVC pierwszy człon katalogu interpretowany jako nazwa kontroler drugi jako metoda.
/{kontroler}/{metoda}
Dzięki temu uzyskujemy przyjazne linki, lepiej wyglądające i czytelniejsze dla użytkownika. W rzeczywistości możemy dopisać swoje własne reguły interpretacji adresów URL. W tym celu należy modyfikować plik /App_Start/RouteConfig.cs
Początkowo istnieje tam wyłącznie jedena-domyślna reguła mapująca adres. Każda reguła cechuje się trzema parametrami:
• name – nazwa reguły (id), unikatowa.
• url – wyrażenie mapujące, czyli wskazuje jak adres ma zostać pocięty i do jakich zmiennych przypisać wycięte frazy.
• defaults – przypisanie wartości domyślnych zmiennym, albo idąc inną drogą wartości początkowe, które mogą zostać nadpisane treścią wyciętą z url-a.
Stałymi zmiennymi jest {controller} , czyli nazwa kontrolera oraz {action} , czyli nazwa metody wywołanej na kontrolerze. Te dwa parametry mogą się nie znaleźć w wyrażeniu mapującym, ale muszą zostać podane w wartościach domyślnych.
Powyższa reguła będzie interpretowała jedynie adresy rozpoczynające się od /domdom np: • /domdom – DomController→Index – parametry {nr=null}
• /domdom/Add – DomController→Add – parametry {nr=null} • /domdom/Add_123 – DomController→Add – parametry {nr=123} • /domdom?nr=123 – DomController→Index – parametry {nr=123} • /domdom/index_123?a=321 – DomController→Add – {nr=123, a=321}
Powyższa natomiast reguła będzie interpretowała jedynie adresy rozpoczynające się od /d np: • /d – DomController→Index – {nr=null, lok=null}
• /d/1 – DomController→Index – {nr=1, lok=null} • /d/3/12 – DomController→Index – {nr=3, lok=12}
• /d?abc=123 – DomController→Index – {nr=3, lok=12, abc=123} • /d/3?a=321&b=abc – DomController→Add – {nr=3, lok=null,
a=321, b=”abc”}
Pamiętajmy, że kolejność reguł jest ważna jeśli URL spasuje do jednej z pierwszych reguł, wówczas dalej już nie są sprawdzane. Z tego powodu domyślna jest na samym końcu ponieważ pasuje do wszystkich URL-ów.
b. Helpery
W MVC pełnią rolę klas pomocniczych. Można je podzielić na dwie grupy. Pierwsze URL-helpers pomagają generować adresy url. Drugie HTML-helpers generują gotowe fragmenty kodu HTML. Zazwyczaj oba typy helperów wykorzystywane są w widokach.
URL-helpers
Do tej pory w widokach podawaliście adresy URL ręcznie w formie tekstu. np. • /dom/edit
Ta forma może doprowadzić do problemów, gdyż np. zmiana rutingu będzie wymagać zmiany wszystkich adresów w widokach. Zamiast tego można skorzystać z helpera.
Wywołanie metody @Url.Action("Edit", new { id=id }) utworzy nam odpowiedniego linka zgodnie z regułami rutingu. Pierwszy parametr jest akcją, następnie przekazywany jest dynamiczny obiekt z pozostałymi dowolnymi parametrami. W tej formie parametry są również enkodowane, gdyż jak wiadomo w URL-u nie mogą występować np. spacje, jak również inne znaki specjalne.
HTML-helpers
Ten rodzaj helpera służy do generowania elementów-tagów HTML. np. obie poniższe linijki wygenerują ten sam link. Druga korzysta z helpera @Html.ActionLink.
Analogicznie:
Można zapisać przy użyciu helpera w następujący sposób:
Do najczęściej wykorzystywanych metod z html-helpera należą:
•
@using(Html.BeginForm()){ HTML } - generuje formularz <form>. Ponieważ formularz okala inne elementy to używamy go razem z blokiem using(){}.•
@Html.LabelFor(m=>m.Adres) – generuje element <label> z treścią. Jako parametr przyjmuje wyrażenie lambda do modelu danych widoku.•
@Html.EditorFor(m=>m.Adres) – generuje element <input>. Jako parametr przyjmuje wyrażenie lambda do modelu danych widoku.•
@Html.ValidationMessageFor(m=>m.Adres) – wyświetla informację o błędach walidacji pola.•
@Html.NameFor(m=>m.Pokoi) – wyświetla nazwę pola z modelu danych.•
@Html.DisplayFor(m=>m.Pokoi) – wyświetla wartość pola z modelu danych. Wymienione metody występują również bez dopisku For co oznacza, że nie są one powiązane z modelem danych widoku. Trzeba wtedy podać więcej parametrów, które w normalnej sytuacji są sczytywane z modelu danych. np.Zadanie
Rozszerzyć aplikację z poprzednich zajęć. Zaktualizować widoki z użyciem helperów. Zmodyfikować ruting, tak aby domyślny kontroler był kontrolerem biblioteki. Zbadać jak zachowują się generowane linki z różną kombinacją parametrów, w zależności od wprowadzonych reguł rutingu.
Dla przypomnienia, aplikacja ma służyć do zarządzania biblioteką. Podstawową funkcjonalnością jest wyświetlanie i dodawanie książek do katalogu. Dodatkowo aplikacja powinna pozwalać wyszukiwać i usuwać pozycje z katalogu.