W tym wpisie przyjrzymy się kontrolerom w aplikacji ASP.NET MVC oraz akcjom, które mogą one zawierać. Kontrolery są odpowiedzialne za odpowiadanie na żądania użytkownika. Każde żądanie kierowane z przeglądarki jest obsługiwane przez określony kontroler. Przykładowo użytkownik klika przycisk odpowiadający za dodanie nowego wydarzenia, natomiast kontroler (EventsController) w odpowiedzi wyświetla odpowiedni widok. Akcja, która się w tym przypadku wykona jest zawarta w metodzie Create typu GET.
1 2 3 4 5 6 7 8 |
// GET: Events/Create [Authorize] public ActionResult Create() { ViewBag.LocationId = new SelectList(_locationRepository.GetLocations().OrderBy(l => l.Name), "Id", "Name"); ViewBag.TypeId = new SelectList(_eventTypeRepository.GetEventTypes().OrderBy(et => et.Name), "Id", "Name"); return View(); } |
Zgodnie z dobrymi praktykami należy pamiętać, że w kontrolerze nie powinno być zawartej logiki biznesowej, ani logiki odpowiedzialnej za dostęp do danych. No dobrze, ale jak to się dzieje że akcje są wykonywane przez odpowiednie metody kontrolera? Za to odpowiedzialny jest routing. Przykładowo wywołujemy URL: http://localhost/Events/Create i w tym przypadku zostanie wywołana metoda Create() z klasy EventsController. Akcje kontrolera muszą być metodami publicznymi. Także każda metoda publiczna w kontrolerze staje się wystawioną na zewnątrz akcją. Każda akcja zwraca typ ActionResult. W przypadku powyższej metody Create zwracany jest typ ViewResult. Wystarczy zwrócić wynik metody View(), a zwrócony zostanie widok o nazwie Create znajdujący się w katalogu Events (czyli o takiej samej nazwie jak kontroler). Identyczny efekt osiągniemy gdy wywołamy metodę View(„Create”), wtedy jawnie wskazujemy nazwę widoku. Poza typem ViewResult w ASP.NET MVC jest dostępnych jeszcze kilka innych typów. Lista wszystkich typów prezentuje się następująco:
- ViewResult – zwraca widok
- PartialViewResult – zwraca widok częściowy
- EmptyResult – zwraca null
- RedirectResult – przekierowuje do innej akcji za pomocą adresu URL
- RedirectToRouteResult – przekierowuje do innej akcji bez odwiedzania adresu URL
- JsonResult – zwraca dane w postaci JSON
- JavaScriptResult – zwraca kod w postaci JavaScript
- ContentResult – zwraca wartość tekstową
- FileContentResult – reprezentuje plik do pobrania, jako tablicę bitów
- FilePathResult – zwraca ścieżkę do pliku
- FileStreamResult – reprezentuje plik do pobrania, jako strumień danych
Każdy z typów dziedziczy z klasy bazowej ActionResult. Poniżej znajdują się przykładowe implementacje akcji:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
public ActionResult Partial() { var events = _eventRepository.GetEvents(); return PartialView("Index", events); } public ActionResult EmptyResult() { return new EmptyResult(); } public ActionResult RedirectResult() { var locations = _locationRepository.GetLocations(); return RedirectToAction("Index", locations); } public ActionResult RedirectToRouteResult() { return RedirectToRoute("Index", "Home"); } public ActionResult JsonResult() { return Json(new { Id = 2016, Name="BreakingChanges" }); } public ActionResult JavaScriptResult() { return JavaScript("alert('Hello World')"); } public ActionResult ContentResult() { return Content("TestContent"); } public ActionResult FileContentResult() { string path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "files", "virus.exe"); return File(System.IO.File.ReadAllBytes(path), "application/x-msdownload"); } public ActionResult FilePathResult() { string path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "files", "virus.exe"); return File(path, "application/x-msdownload", "virus.exe"); } public ActionResult FileStreamResult() { string path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "files", "virus.exe"); return File(System.IO.File.OpenRead(path), "application/x-msdownload"); } |