Przez ostatnie lata nie zajmowałem zbytnio się aplikacjami webowymi ale stopniowo zmienia się to. Z tego względu więcej na blogu można spodziewać się takiej tematyki. Powoli sobie wszystko przypominam. Prawdopodobnie dla wielu z Was będą to podstawy ale mam nadzieję, że komuś przydadzą się takie wpisy.
W poście chciałbym pokazać czym różni się RouteUrl od Action. Zacznijmy następującej metody:
public ActionResult Index() { string action = Url.Action("Index"); string route = Url.RouteUrl("CustomRoute2"); Response.Write(string.Format("Action: {0}<br/>",action)); Response.Write(string.Format("Action: {0}", route)); return View(); }
Action służy do generowania linku na podstawie przekazanych danych o akcji, kontrolerze itp. Route robi dokładnie to samo, z tym, że można przekazać dokładnie z jakiego route ma korzystać. Action wybierze po prostu pierwszy zdefiniowany routing. Przyjrzyjmy się naszej konfiguracji:
routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.MapRoute("CustomRoute1", "OldApp/{action}/{id}", new {controller = "Home", action = "Index", id = UrlParameter.Optional}); routes.MapRoute("CustomRoute2", "App/{action}/{id}", new { controller = "Home", action = "Index", id = UrlParameter.Optional }); routes.MapRoute( "Default", // Route name "{controller}/{action}/{id}", // URL with parameters new { controller = "Home", action = "Index", id = UrlParameter.Optional } );
Pierwsza dopasowana to CustomRoute1. Zatem Action wyświetli OldApp/Nazwa Kontrolera/Nazwa Akcji. Z kolei do wywołania RouteUrl przekazujemy dokładnie nazwę konfiguracji, co oznacza, że zostanie wygenerowany link w postaci App/. Możliwe oczywiście jest korzystanie z tych funkcji w widoku. Analogicznie istnieje funkcja RouteLink, która wykonuje podobne zadanie co ActionLink, z tym, że wygenerowany link wykorzystuje konkretny routing.
Warto zaznaczyć, że lepiej unikać generowania linków dla specyficznego routingu. W kodzie unikamy ręcznego wpisywania <a href …/>, aby nie być zależnym od routingu. ActionLink wygeneruje link poprawny dla danej konfiguracji. Jeśli zmienimy zatem routing w międzyczasie, ActionLink odzwierciedli to w przeciwieństwie do sztywno przypisanego <a href…/>.
A jeszcze lepiej uzyc T4MVC dzieki czemu pozbedziemy sie magicznych stringow i wprzypadku zmiany nazwy metody/kntorlera od razu wylapiemy blad