ASP.NET MVC v praxi od A do Z, 4. díl – Controllers a Views
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama

ASP.NET MVC v praxi od A do Z, 4. díl – Controllers a ViewsASP.NET MVC v praxi od A do Z, 4. díl – Controllers a Views

 

ASP.NET MVC v praxi od A do Z, 4. díl – Controllers a Views

Google       Google       19. 8. 2009       16 086×

Dnes nás čekají zbylé dvě MVC komponenty – Controllery a Views.

Reklama
Reklama

U klasických webových aplikací je URL mapována na nějaký fyzický soubor na disku, URL tak končí například něčím jako „index.html“, „Default.aspx“, „kontakt.php“ a podobně.

MVC jde trochu jinou cestou. Místo toho, aby byly URL mapovány na soubory, jsou mapovány na metody a třídy. Těmto třídám se říká controllery a jsou zodpovědné za zpracovávání HTTP požadavků, zachytávání vstupu od uživatele, získávání a ukládání dat a rozhodování o tom, co bude posláno zpět uživateli. Minule jsme postavili základní model aplikace, takže se dnes vrhneme na controller, který ho bude využívat a na závěr zobrazí data pomocí view.

Přidání controlleru do projektu

Začneme přidáním nového controlleru do adresáře Controllers v Solution Exploreru. Klikneme na něj pravým tlačítkem, zvolíme možnost Add > Controller a pojmenujeme ho DinnersController.

Přidání akčních metod Index a Details do DinnersControlleru

Chceme návštěvníkům naší aplikace umožnit prohlížení nadcházejících večeří a kliknutím na nějakou zobrazit detaily o ní. Docílíme toho vytvořením dvou URL, které popisuje následující tabulka:

URL Účel
/Dinners/Dinners Zobrazí seznam nadcházejících večeří.
/Dinners/Details/{id} Zobrazí detaily o konkrétní večeři podle parametru {id}, který bude korespondovat s ID večeře v databázi.

Tyto dva formáty URL vytvoříme jednoduchým přidáním tzv. „akčních metod“ do DinnersControlleru:

public class DinnersController : Controller
{
    // HTTP-GET: /Dinners/
    public void Index()
    {
        Response.Write("<h1>Brzo bude: Dinners</h1>");
    }

    // HTTP-GET: /Dinners/Details/2
    public void Details(int id)
    {
        Response.Write("<h1>Detaily o večeři s DinnerID: " + id + "</h1>");
    }
}

Zkusíme aplikaci spustit (Ctrl+F5) a na konec URL napsat „/Dinners/“, což způsobí zavolání metody Index a ta vypíše text jako na obrázku.

Pokud do URL přidáme ještě „Details/3“, uvidíme toto:

Mohli byste se zeptat: jak ASP.NET MVC ví, že má použít třídu DinnersController, pro URL „/Dinners/“ použít metodu Index a tak podobně? Abychom to pochopili, tak se podíváme, jak funguje routování.

Routování v ASP.NET MVC

ASP.NET MVC obsahuje mocný routing engine, který nám dává hodně možností v nastavování mapování URL na controllery. Můžeme nastavit, který controller kdy použít, jakou metodu použít a také nastavit automatické parsování proměnných z URL (pomocí querystringu) a rovnou je předat metodě jako parametr.

V základě má každý MVC projekt přednastavenou sadu routovacích pravidel, kterou najdeme v souboru Global.asax. Pravidla jsou zaregistrována pomocí metody RegisterRoutes, která vypadá ve výchozí podobě následovně:

public void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    routes.MapRoute(
        "Default",                                       // název pravidla
        "{controller}/{action}/{id}",                    // URL s parametry
        new { controller = "Home", action = "Index", id = "" }  // výchozí hodnoty parametrů
    );
}

Volání metody routes.MapRoute v kódu výše zaregistruje výchozí (proto je toto pravidlo pojmenované „Default“) cestu, která mapuje příchozí URL na controller třídu, podle formátu „/{controller}/{action}/{id}“, kde „controller“ je název controlleru, „action“ je jméno akční metody a „id“ je nepovinný parametr v URL, který může být předán jako parametr vybrané akční metodě. Třetí parametr metody MapRoute je přiřazení výchozích hodnot pro případ, že by v příchozí URL nebyly přítomny.

V následující tabulce je vypsáno pár ukázkových platných URL, včetně použitého controlleru, akční metody a předaného parametru.

URL Controller Akční metoda Předaný parametr
/Dinners/Details/2 DinnersController Details(id) id=2
/Dinners/Edit/5 DinnersController Edit(id) id=5
/Dinners/Create DinnersController Create() -
/Dinners DinnersController Index() -
/Home HomeController Index() -
/ HomeController Index() -

Poslední tři řádky využívají výchozí akční metodu, kterou jsme nastavili jako Index, a proto se, pokud ji nespecifikujeme v URL, použije ona a je jedno, jestli jsme zavolali controller Dinners nebo Home, protože oba obsahují svoji verzi metody Index.

Pokud by vám tento tvar URL nevyhovoval, není problém ho změnit v už zmíněné metodě RegisterRoutes. Naší aplikaci to ale naprosto vyhovuje, a proto nic měnit nebudeme.

Použití třídy DinnerRepository z DinnersControlleru

Pojďme teď nahradit naše současné implementace metod Index a Details v DinnersControlleru kódem, který bude využívat model z minulého dílu.

Referencujeme namespace NerdDinner.Models, vytvoříme instanci třídy DinnerRepository a máme vesměs hotovo. Od této chvíle už můžeme z controlleru volat metody třídy DinnerRepository pro vyhledávání nadcházejících večeří, mazání večeří a podobně. Nový kód souboru DinnersController.cs bude vypadat takto:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using NerdDinner.Models;

namespace NerdDinner.Controllers
{
    public class DinnersController : Controller
    {
        DinnerRepository dinnerRepository = new DinnerRepository();

        // GET: /Dinners/
        public void Index()
        {
            var dinners = dinnerRepository.FindUpcomingDinners().ToList();
        }

        // GET: /Dinners/Details/2
        public void Details(int id)
        {
            Dinner dinner = dinnerRepository.GetDinner(id);
        }
    }
}

Bystřejší z vás si jistě všimli, že tento kód má jednu zásadní vadu. Sice získává data z databáze, ale nijak je nezobrazuje. Pro zobrazování dat potřebujeme využít poslední ze tří komponent MVC architektury – view.

Zobrazování dat z controlleru pomocí view

I když můžeme skládat výsledný HTML kód uvnitř akčních metod a pak ho použitím metody Response.Write poslat zpět klientovi, je tento postup na první pohled přinejmenším nepohodlný. Mnohem lepší způsob je poslat data potřebná k vykreslení stránky nějaké šabloně (view šabloně) a ta se postará o zbytek. Jak za chvíli uvidíme, view šablona je textový soubor s příponou .aspx, který obsahuje kombinaci HTML kódu a kódu pro referování (pokud jste někdy vyvíjeli s klasickými WebForms, tak je vám tento formát určitě dobře známý).

Uděláme další změnu v kódu DinnersControlleru. Místo toho, aby naše akční metody vracely void, budou vracet ActionResult a uvnitř kódu metod budeme vracet typ ViewResult pomocí metody View:

public class DinnersController : Controller
{
    DinnerRepository dinnerRepository = new DinnerRepository();

    // GET: /Dinners/
    public ActionResult Index()
    {
        var dinners = dinnerRepository.FindUpcomingDinners().ToList();

        return View("Index", dinners);
    }

    // GET: /Dinners/Details/2
    public ActionResult Details(int id)
    {
        Dinner dinner = dinnerRepository.GetDinner(id);

        if (dinner == null)
            return View("NotFound");
        else
        {
            return View("Details", dinner);
        }
    }
}

Signatura metody View, kterou jsme v kódu použili, vypadá takto:

ViewResult View(string viewName, object model);

První parametr je název view šablony, kterou chceme použít pro vykreslení HTML. Druhý parametr je objekt, který šablona potřebuje pro to, aby mohla HTML vytvořit (například objekt reprezentující večeři).

V metodě Index dáváme najevo, že chceme použít šablonu, která se jmenuje Index (ještě ji nemáme vytvořenou) a předáváme jí kolekci nalezených večeří. Metoda Details funguje podobně, jen navíc kontrolujeme, jestli byla vůbec nějaká večeře podle zadaného ID nalezena. Pokud nebyla, použijeme šablonu NotFound, pokud ano, použijeme šablonu Details.

Jsme na konci dalšího z mnoha dílů, celý příští článek bude o trojici šablon: Index, NotFound a Details.

Zdroj: http://nerddinnerbook.s3.amazonaws.com/Part4.htm

×Odeslání článku na tvůj Kindle

Zadej svůj Kindle e-mail a my ti pošleme článek na tvůj Kindle.
Musíš mít povolený příjem obsahu do svého Kindle z naší e-mailové adresy kindle@programujte.com.

E-mailová adresa (např. novak@kindle.com):

TIP: Pokud chceš dostávat naše články každé ráno do svého Kindle, koukni do sekce Články do Kindle.

Hlasování bylo ukončeno    
0 hlasů
Google
(fotka) Jakub KottnauerJakub studuje informatiku na FIT ČVUT, jeho oblíbenou platformou je .NET.
Web     Twitter     Facebook     LinkedIn    

Nové články

Obrázek ke článku Blockchain & Bitcoin konference

Blockchain & Bitcoin konference

V pátek 19. 5. 2017 se v pražském konferenčním centru Andel’s konala Blockchain & Bitcoin konference. Řada odborníků a podnikatelů v oboru blockchainu a kryptoměn představila možnosti budoucího směřování tohoto oboru. Speakeři většinou rusky mluvící provenience prezentovali řešení svých firem založená na technologii blockchainu.

Reklama
Reklama
Obrázek ke článku Malware KONNI se úspěšně skrýval 3 roky. Odhalil ho bezpečnostní tým Cisco Talos

Malware KONNI se úspěšně skrýval 3 roky. Odhalil ho bezpečnostní tým Cisco Talos

Bezpečnostní tým Cisco Talos odhalil celkem 4 kampaně dosud neobjeveného malwaru, který dostal jméno KONNI. Ten se dokázal úspěšně maskovat od roku 2014. Zpočátku se malware zaměřoval pouze na krádeže citlivých dat. Za 3 roky se ale několikrát vyvinul, přičemž jeho současná verze umožňuje útočníkovi z infikovaného počítače nejenom krást data, ale i mapovat stisky na klávesnici, pořizovat screenshoty obrazovky či v zařízení spustit libovolný kód. Pro odvedení pozornosti oběti zasílali útočníci v příloze také obrázek, zprávu a výhružkách severokorejského režimu či kontakty na členy mezinárodních organizací.

Obrázek ke článku Pouze jedna z deseti lokálních firem ví o pokutách plynoucích z GDPR

Pouze jedna z deseti lokálních firem ví o pokutách plynoucích z GDPR

Trend Micro, celosvětový lídr v oblasti bezpečnostních řešení a VMware, přední světový dodavatel cloudové infrastruktury a řešení pro podnikovou mobilitu, oznámily výsledky výzkumu mezi českými a slovenskými manažery zodpovědnými za ochranu osobních údajů, který zjišťoval, jak jsou připraveni na nové nařízení o ochraně osobních údajů (GDPR). Většina firem v České republice a na Slovensku nad 100 zaměstnanců je již s novým nařízením GDPR obeznámena. Výzkum provedený ve spolupráci s agenturou Ipsos ukázal, že téměř 8 firem z 10 o nařízení ví, přičemž jeho znalost je o něco vyšší na Slovensku (89 %) než v České republice (69 %).

Obrázek ke článku Vyděračský software Locky se vrací, tváří se jako potvrzení platby, odhalil tým Cisco Talos

Vyděračský software Locky se vrací, tváří se jako potvrzení platby, odhalil tým Cisco Talos

Jeden z nejznámějších ransomwarů, Locky, se vrací. Po většinu roku 2016 patřil mezi nejrozšířenější vyděračské softwary. Ke svému šíření využíval emailové kampaně s infikovanými přílohami. Ransomware Locky byl rozesílán prostřednictvím botnetu (internetový robot zasílající spamy) Necurs. Jeho aktivita na konci roku 2016 téměř upadla a spolu s ní i šíření ransomwaru Locky. Před několika týdny se Necurs opět probudil a začal posílat spamy nabízející výhodný nákup akcií. Dne 21. dubna zaznamenal bezpečnostní tým Cisco Talos první velkou kampaň ransomwaru Locky prostřednictvím botnetu Necurs za posledních několik měsíců.

loadingtransparent (function() { var po = document.createElement('script'); po.type = 'text/javascript'; po.async = true; po.src = 'https://apis.google.com/js/plusone.js'; var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(po, s); })();
Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032017 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý