#9.5 Tworzenie formularza kontaktowego i wszystkich komponentów potrzebnych do jego obsługi.

Mamy już stworzoną stronę główną (widok Index). Teraz przyszedł czas na stworzenie formularza kontaktowego, do którego będziemy przechodzić poprzez link ze strony głównej. W tym celu musimy wykonać następujące czynności:

  • stworzyć model danych dla naszego formularza,
  • zmodyfikować stronę główną (widok Index) poprzez umieszczenia na niej odpowiedniej treści oraz linku do widoku formularza,
  • utworzyć nową metodę akcji, która będzie zarządzała nowym widokiem formularza (kontroler Home),
  • stworzyć nowy widok formularza, który będzie oparty na stworzonym wcześniej modelu danych.

W tym rozdziale będę korzystał czasami z gotowego kodu bez szczegółowego wyjaśnienia, ponieważ pewne zagadnienia będę opisywał szczegółowo w dalszej części kursu.

#9.4 Dodajemy dynamiczną treść do widoku.

Dodawania do naszego widoku statycznej i dynamicznej treści.

Teraz chcielibyśmy dodać do naszego widoku jakąś treść. I o ile ze statyczną treścią nie ma większego problemu to dynamiczną musimy jakoś wygenerować i przesłać do widoku. Generowanie dynamicznej treści wykonuje się w kontrolerze, ale jeszcze później musimy w jakiś sposób przekazać ją do widoku?

Żeby zobaczyć jakikolwiek efekt zmodyfikujemy troszeczkę nasz nowo utworzony widok, ale także nasz kontroler Home. Wstawimy na naszą stronę główną (widok: Index) jakąś treść. Dodamy treść „Witaj! Znajdujesz się na stronie głównej.” i w następnym wierszu dodamy aktualną datę i godzinę.

Tekst statyczny, który będzie się pokazywał na stronie Index możemy wpisać bezpośrednio w pliku widoku Index. Natomiast dynamiczną część, czyli aktualna datę i godzinę, musimy wygenerować w kontrolerze i później przekazać ją do widoku. I tym się zajmiemy w pierwszej kolejności. Nasz kontroler Home należy zmodyfikować zgodnie z listingiem 9.4.1, pogrubioną czcionką zaznaczona zmodyfikowana treść kontrolera.

Listing 9.4.1 Modyfikacja kontrolera Home.

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

namespace PierwszaAplikacja.Controllers
{
    public class HomeController : Controller
    {
        // GET: Home
        public ViewResult Index()
        {
            ViewBag.DataGodzina = DateTime.Now;
            return View();
        }
    }
}

Do przechowania i przekazania daty i godziny z kontrolera do widoku użyjemy dynamicznego obiektu ViewBag, do którego możemy stworzyć właściwość DataGodzina (nazwa naszej właściwości jest dowolna) i do tej właściwości przypiszemy wartość aktualnej daty i godziny dzięki poleceniu DateTime.Now. Stworzenie właściwości DataGodzina dla obiektu ViewBag i przypisanie do niej wartości aktualnej daty i godziny wygląda następująco.

 

	ViewBag.DataGodzina = DateTime.Now;

Za pomocą obiektu ViewBag aktualną datę i godzinę możemy przekazać do naszego widoku Index. W tym celu modyfikujemy nasz widok Index. Pogrubioną czcionką zaznaczona jest zmodyfikowana część kodu.

Listing 9.4.2 Modyfikacja widoku Index.

 @{
    Layout = null;
}
<!DOCTYPE html>

<html>
<head>
<meta name="viewport" content="width=device-width" />
    <title>Strona główna</title>
</head>
<body>
    <div> 
            Witam ! <br>
            Aktualna data i godzina: @ViewBag.DataGodzina
    </div>
</body>
</html>

Jak widać kawałek kodu @ViewBag.DataGodzina służy do wywołania właściwości DataGodzina obiektu ViewBag. W tym właśnie miejscu w przeglądarce internetowej pojawi się aktualna data i godzina. Żeby zobaczyć efekt naszych działań uruchamiamy nasz projekt (F5), co prezentuje rysunek 9.4.1.

9.4.1 Widok projektu w przeglądarce internetowej po modyfikacjach kontrolera i widoku._
9.4.1 Widok projektu w przeglądarce internetowej po modyfikacjach kontrolera i widoku._

#9.3 Tworzymy nowy widok o nazwie Index

Tworzymy nowy widok o nazwie Index

W poprzednim podrozdziale (9.2 Tworzymy nowy kontroler „HomeController”) utworzyliśmy pierwszy kontroler w naszym projekcie a mino to projekt w dalszym ciągu „wyrzuca” błąd. Tak jak już pisałem błąd ten jest spowodowany tym, że nie mamy utworzonego w naszym projekcie żadnego widoku (w naszym przypadku brak widoku o nazwie Index bo takiego właśnie widoku szuka kompilator). Przyszedł więc czas na stworzenie nowego pierwszego widoku.

Utworzyć widok możemy na dwa sposoby:

Sposób 1

Klikamy prawym przyciskiem myszy (PPM) na nazwie metody akcji Index, w kontrolerze Home, i z rozwiniętego menu wybieramy opcję Add View.

Rysunek 9.3.1. Tworzymy nowy widok o nazwie Index.
Rysunek 9.3.1. Tworzymy nowy widok o nazwie Index.

W oknie Add View konfigurujemy widok i potwierdzamy ustawienia.

Rysunek 9.3.2 Okno Add View, konfiguracja nowego widoku.
Rysunek 9.3.2 Okno Add View, konfiguracja nowego widoku.

Z uwagi na fakt, że tworzyliśmy widok klikając na metodzie Index Visual Studio automatycznie nazwał ten widok tak jak metoda dla której tworzymy ten widok, czyli Index. W polu szablon (template) wybieramy Empty (without model) i potwierdzamy przyciskiem Add. Opcję Empty (without model) wybieramy dlatego, widok Index będzie naszą stroną startową. Nie będzie ona prezentowała żadnych danych z modelu, dlatego korzystamy z ww. opcji.

Teraz przejdźmy do okna Solution Explorer i zobaczymy tam, że w folderze Views > Home utworzony został widok o nazwie Index.

Rysunek 9.3.3 Utworzony nowy widok w oknie Solution Explorer.
Rysunek 9.3.3 Utworzony nowy widok w oknie Solution Explorer.

Treść nowo utworzonego widoku możemy zobaczyć klikając na plik Index.cshtml.

Listing 9.3.1 Kod nowo utworzonego widoku o nazwie Index.

 

@{
    Layout = null;
}

<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>Index</title>
</head>
<body>
    <div> 
    </div>
</body>
</html>


Kiedy uruchomimy nasz projekt w przeglądarce internetowej zobaczymy pustą stronę. Pustą dlatego, że nie umieściliśmy w niej żadnej treści. O tym, że uruchomiony jest widok Index świadczy tytuł strony i adres wyświetlany przez przeglądarkę (Rysunek 9.3.3).

Rysunek 9.3.4 Uruchomiony widok Index w przeglądarce internetowej.
Rysunek 9.3.4 Uruchomiony widok Index w przeglądarce internetowej.

#9.2 Tworzymy nowy kontroler – HomeController

Tworzymy nowy kontroler o nazwie Home (HomeController).

Wiemy już jak stworzyć nowy pusty projekt. Zerknijmy teraz do modułu Solution Explorer i zerknijmy do katalogów Controllers i Views. Widzimy tam, że narazie nie mamy stworzonych żadnych kontrolerów i widoków.

PierwszaAplikacja - Solution Explorer.
Rysunek 9.2.1. PierwszaAplikacja – Solution Explorer.

Po uruchomieniu projektu w takim momencie otrzymamy błąd w przeglądarce (Rysunek 9.2.2).

Visual Studio - pierwsze uruchomienie pustego projektu "PierwszyProjekt".
Rysunek 9.2.2 Visual Studio – pierwsze uruchomienie pustego projektu „PierwszaAplikacja”.

Dlaczego otrzymamy taki błąd? Bo wybraliśmy szablon Empty i jeszcze nic nie dodaliśmy do naszego projektu.

W pierwszej kolejności dodamy kontroler o nazwie Home. W oknie Solution Explorer klikamy PPM na folderze Controllers i z rozwijalnego menu wybieramy opcję Add a później Controller.

Tworzymy nowy kontroler Home.
Rysunek 9.2.3. Tworzymy nowy kontroler Home.

Pojawia się okno z możliwością wyboru typu kontrolera. W naszym przykładzie wybieramy Empty i klikamy na OK.

Wybieramy typ kontrollera Home.
Rysunek 9.2.4. Wybieramy typ kontrolera Home.

Zgodnie z konwencją MVC nazwy kontrolerom nadajemy dodając do nazwy słówko Controller (jak poniżej).

9.2.5. Kontroler Home - nadawanie nazwy.
Rysunek 9.2.5. Kontroler Home – nadawanie nazwy.

W takie prosty sposób stworzyliśmy nasz pierwszy kontroler o nazwie Home i możemy go zobaczyć w oknie Solution Explorer’a w folderze Controllers.

9.2.6. HomeController.
Rysunek 9.2.6. HomeController.

Jeżeli klikniemy na niego w oknie głównym zobaczymy zawartość naszego kontrolera.

9.2.7. Zawartość kontrolera Home.
Rysunek 9.2.7. Zawartość kontrolera Home.

No dobrze, mamy nasz kontroler i co się teraz stanie jak uruchomimy nasz projekt (wciskamy F5)?

9.2.8. Błąd widoku kontrolera.
Rysunek 9.2.8. Błąd widoku kontrolera.

No nie! Znowu błąd?

Błąd występuje dlatego, że nie mamy jeszcze utworzonego widoku, który chcemy wyświetlić. W chwili uruchomienia projektu, uruchamiamy metodę Index z kontrolera Home. Dlaczego? Bo w domyślnej ścieżce rutingu (pamiętamy: plik RouteConfig.cs w folderze App_Start) jest zapis.

 routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}",
                defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
            );

Czyli na początku próbujemy uruchomić metodę Index z kontrolera Home. A ta metoda zawiera metodę View() która zwraca nam odpowiedni widok. Zgodnie z konwencją MVC kompilator szuka widoku o takiej samej nazwie jak nasza metoda akcji, czyli szuka widoku o nazwie Index, a takiego widoku na razie nie ma. Stąd ten błąd. Ale spokojnie w kolejnych częściach kursu utworzymy odpowiedni widok.

Ostatnim działaniem w tym podrozdziale będzie lekka modyfikacja metody Index według poniższego listingu.
Listing 9.3.1 Modyfikacja metody Index w kontrolerze HomeController (zmodyfikowana część jest pogrubiona).

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

namespace PierwszaAplikacja.Controllers
{
   public class HomeController : Controller
   {
       // GET: Home
       public ViewResult Index()
       {
           return View();
       }
   }
}

Różnica między użyciem ActionResult na ViewResult zostanie wyjaśnione w dalszej części kursu. Na tą chwilę wyjaśnię tylko tyle, że metoda ViewResult() dziedziczy po metodzie ActionResult().

 

#9.1 Tworzymy pusty projekt ASP.NET MVC Web Application

Tworzymy pusty projekt ASP.NET Web Application w Visual Studio.

W tym celu skorzystamy z procedury tworzenia nowego projektu która opisałem tutaj. W tym miejscu wypunktuję tylko kroki jakie musimy wykonać aby utworzyć nowy pusty projekt, a jeśli chcesz zapoznać się z tematem bardziej szczegółowo kliknij w link do procedury.

1.1. Kliknij w link Visual Studio 2015 (standardowo znajduje się na pulpicie).

1.2. Po otwarciu się aplikacji wybierz kombinację klawiszy Ctrl + Shift + N.

1.3. Z drzewka po lewej wybierz opcję Templates > Visual C# > Windows > Web a później wybierz opcję ASP.NET Web Application Visual C# z okna po środku i potwierdzasz przyciskiem OK.

1.4. Wybieramy szablon Empty, zaklikujemy opcję MVC poniżej okna z szablonami i potwierdzasz przyciskiem OK.

1.5. I już mamy utworzony nowy pusty projekt ASP.NET MVC.

#9 Pierwsza aplikacja w ASP.NET MVC

Pierwsza aplikacja w ASP.NET MVC

Myślę, że doszliśmy już do takiego momentu kiedy będziemy w stanie napisać naszą pierwszą mini aplikację w ASP.NET MVC. Każda szanująca się firma powinna mieć na swojej stronie formularz zgłoszeniowy. I właśnie coś takiego zrobimy w ramach naszej pierwszej aplikacji. Bez zbędnych wstępów, zaczynamy.

Krótko opiszę co będziemy robić po kolei:

  • stworzymy nowy kontroler, który będzie „zarządzał” naszą aplikacją. W trakcie rozwoju naszego projektu będziemy dodawali do niego odpowiednie metody akcji,
  • stworzymy także kilka widoków do „komunikacji” z użytkownikiem,
  • napiszę także parę słów o kontroli poprawności danych w formularzu, jak dodawać dodatkowe komponenty do naszego projektu a także jak korzystać z zewnętrznych komponentów typu biblioteka Bootstrap.

Procedura – tworzenie nowego projektu ASP.NET MVC (WebApplication)

Tworzenie nowego projektu ASP.NET MVC (WebApplication) – krok po kroku

(procedury będę tworzył w sytuacji kiedy jakieś działania będziemy wykonywać cyklicznie.)

W tej procedurze pomocniczej opiszę jak utworzyć pusty projekt ASP.NET MVC – WebApplication

  1. Uruchom program Visual Studio Community 2015
    Standardowo na pulpicie znajduje się link

    Visual Studio Community 2015 skrót na pulpicie
    Visual Studio Community 2015 skrót na pulpicie

    opcjonalnie
    klikamy w menu Start (lewy dolny róg w oknie głównym systemu Windows) i w polu wyszukaj programy i pliki wpisujemy Visual Studio i klikamy w opcję Visual Studio 2015

    Uruchamianie Visual Studio 2015 z menu Start
    Uruchamianie Visual Studio 2015 z menu Start

    Po uruchomieniu Visual Studio 2015 zobaczymy „widok główny” aplikacji.

    Visual Studio "widok główny" aplikacji.
    Visual Studio „widok główny” aplikacji.
  2. Aby utworzyć nowy projekt możemy zrobić to na kilka sposobów
    Klikamy na link New Project w oknie głównym aplikacji

    Visual Studio - tworzenie nowego projektu.
    Visual Studio – tworzenie nowego projektu.

    lub wybieramy z menu File opcję New i następnie Project…

    Visual Studio - tworzenie nowego projektu.
    Visual Studio – tworzenie nowego projektu.

    albo możemy skorzystać ze skrótu klawiszowego Ctrl + Shift + N

  3. W oknie New Project z drzewa po lewej stronie wybieramy opcję Templates > Visual C# > Windows > Web. Następnie w środkowym oknie wybieramy opcję ASP.NET Web Application Visual C# i potwierdzamy nasz wybór klikając na przycisk OK

    Visual Studio - okno New Project.
    Visual Studio – okno New Project.
  4. Kolejny krok to wybór szablonu naszego projektu.
    Klikamy w ikonkę Empty później zaznaczamy checkbox przy modelu MVC i potwierdzamy nasz wybór klikając na przycisk OK

    Visual Studio - okno New ASP.NET Project.
    Visual Studio – okno New ASP.NET Project.
  5. W tym momencie Visual Studio tworzy nasz pusty projekt i jego utworzeniu zobaczymy „okno główne” naszego nowego projektu.

    Visual Studio - okno główne pustego projektu PierwszaAplikacja.
    Visual Studio – okno główne pustego projektu PierwszaAplikacja.

#8 Widok

Widok (ang. View)

Widok to jedna z trzech warstwa modelu MVC. W widoku definiujemy co i w jaki sposób będziemy prezentować użytkownikowi. To w widoku definiujemy dynamiczne zmienne które po wywołaniu widoku „uzupełniają się” danymi np. z bazy danych. Przykład prostego widoku, który wyświetla aktualną datę i godzinę. Cała treść, oprócz części pogrubionych, jest wygenerowana automatycznie przy pomocy Visual Studio.

Listing 8.1. Prosty widok (o nazwie Index) do wyświetlenia aktualnej daty
@{
    Layout = null;
}

<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>Aktualna Data</title>
</head>
<body>
    <div> 
        @ViewBag.PokazAktualnaDate
    </div>
</body>
</html>

Poniżej rysunek prezentujący efekt wywołania powyższego widoku w przeglądarce internetowej.

Widok wyświetlający aktualną datę.
Rysunek 8.1. Widok wyświetlający aktualną datę.

Żeby nasz widok mógł wyświetlić aktualną datę i godzinę musieliśmy w kontrolerze w odpowiedniej metodzie ,o takiej samej nazwie jak nasz widok (w tym przypadku jest to widok i metoda o nazwie Index), zdefiniować właściwość ViewBag.PokazAktualnaDate w zaprezentowany poniżej sposób.

ViewBag.PokazAktualnaDate = DateTime.Now;

Poniżej treść kontrolera Home i metody Index

Listing 8.2. Kod kontrolera Home i metody Index
public class HomeController : Controller 
{
    public ViewResult Index() 
        {
            ViewBag.PokazAktualnaDate = DateTime.Now;
            return View();
        }
}

Teraz „zdanie” wyjaśnienia jak to się dzieje, że w przeglądarce internetowej wyświetla się aktualna data i godzina.

Po uruchomieniu naszej aplikacji poprzez mechanizm rutingu przechodzimy do kontrolera Home i metody Index. Dlaczego właśnie do tego kontrolera i do tej metody? Ano dlatego, że domyślnie to właśnie kontroler Home i metoda Index są domyślnymi wartościami dla domyślnej ścieżki rutingu (patrz listing 1 z części #5 Ruting). Teraz popatrzmy co znajduje się w metodzie Index w naszym kontrolerze Home? Zadeklarowaliśmy tam właściwość ViewBag.PokazAktualnaDate która będzie przechowywała aktualną datę i godzinę w momencie wywołania oraz metodę View() która wywoła widok o nazwie Index, bo tak nazywa się nasza metoda w której wywołujemy metodę o nazwie View. Zgodnie z powyższym w naszej przeglądarce w momencie wywołania widoku Index pojawi się aktualna data i godzina.

#7 Model

Model (ang.model)

Modele to zdefiniowane przez nas klasy odzwierciedlające strukturę danych w naszym projekcie, powiedziałbym nawet, że opisują/przenoszą na grunt informatyczny kawałek rzeczywistości którą musimy oprogramować. Proste modele będą tylko reprezentować dane, które później mogą być wyświetlane użytkownikowi. Możemy jednak tworzyć bardziej rozbudowane modele które zawierają w sobie logikę biznesową naszej aplikacji, ale wszystko po kolei.

Model MVC. Interakcje.
Rysunek 7.1. Model MVC. Interakcje.

Przykład prostego modelu:

Opis: Chcielibyśmy stworzyć aplikację która m.in. zawiera formularz kontaktowy. Czyli do wysłania takiej wiadomości musi być stworzony formularz na stronie www, który zawiera najczęściej takie pola jak: imię i nazwisko lub nick, adres e-mail, temat zgłoszenia i opis problemu. W takiej sytuacji nasz model reprezentujący taki formularz mógłby wyglądać tak.

public class MojProgram
    {
        public string Name { get; set; }
        public string Email { get; set; }
        public string Title { get; set; }
        public string Description { get; set; }
    }

#6 Kontroler

Kontroler (ang. controller)

Kontrolery to nic innego jak klasy C# których zadaniem jest obsługa żądań użytkowników (zwykle dziedziczy po klasie System.Web.Mvc.Controller). Kontroler w pierwszej kolejności odbiera dane wejściowe od użytkownika następnie je przetwarza i analizuje.

Skoro kontroler to klasa, to w „środku” musi mieć jakieś metody. Wewnątrz kontrolera wszystkie metody publiczne nazywamy metodami akcji i to za ich pomoc możemy „sterować” aplikacją. Zgodnie z konwencją MVC, aby ułatwiać sobie życie, wszystkie kontrolery należy umieszczać w katalogu Controllers w naszym projekcie (w oknie Solution Explorer), który jest automatycznie tworzony wraz z naszym nowym projektem. Tak jak w życiu jeśli masz wypracowaną jakąś własną konwencję to możesz ją stosować ale zaleca się stosowanie tej ogólnie przyjętej. Jeśli chodzi o nazywanie kontrolerów to przyjęło się że do nazwy kontrolera dodajemy słówko Controller np. HomeController. Z resztą Visual Studio sam proponuje nam przy tworzeniu kontrolerów używanie właściwej konwencji, co obrazuje poniższy zrzut.

ASP.NET MVC Kontrolery
Obrazek 6.1. ASP.NET MVC Kontrolery (nazewnictwo kontrolerów).

 

Na co wpływa kontroler?
Kontroler wpływa zarówno na model i widok. Po analizie danych wejściowych może on np. zaktualizować model oraz odświeżyć widok. Można powiedzieć, że za pomocą kontrolera możemy kontrolować co się w aplikacji dzieje (za pomocą metod akcji które zawiera kontroler).

Jak tworzymy/dodajemy kontrolery do projektu?
W oknie Solution Explorer klikamy na folderze Controllers prawym przyciskiem myszy (zwanym dalej PPM) i z menu kontekstowego wybieramy opcję Add a następnie z kolejnego menu Controller.

Poniżej przykład kontrolera o nazwie HomeController, który zwraca widok metody Index

    public class HomeController : Controller
    {
        public ViewResult Index()
        {
            return View(); // zwraca widok dla metody Index
        }
    }