Podstawy odstawy
Transkrypt
Podstawy odstawy
ASP.NET MVC 3 Podstawy odstawy 1 Zaawansowane programowanie internetowe inter Instrukcja nr 3 1. Cel zajęć Celem zajęć jest zapoznanie się z podstawami ASP.NET MVC 2.0 Framework. Framework 2. Zadanie Proszę zbudować prostą aplikację WWW przy zastosowaniu framework’a ASP.NET MVC 2.0 W tym celu należy wykonać odpowiednie kroki: worzenie projektu I. Stworzenie a) Tworzymy nowy projekt b) Jako typ projektu wybieramy ASP.NET MVC 2 Web Application z grupy Web c) W kolejnym oknie, w którym decydujemy czy chcemy stworzyć również projekt do testowania aplikacji wybieramy opcję „No, do not create a unit test te project”. 2 Zaawansowane programowanie internetowe inter Instrukcja nr 3 II. Stworzenie bazy danych a) Do katalogu App_data dodajemy nową bazę (SQL Server Database), którą nazywamy np. „Kontakty”. b) Dodajemy do bazy danych tabele, zgodnie z diagramem poniżej: Adresy Column Na... Data Type ID int Ulica varchar(100) NrDomu int NrMieszkania int KodPocztowy varchar(6) Miejscowosc varchar(100) TypAdresu varchar(100) IDOsoby int Allow Nulls Osoba FK_Adresy_Osoba FK_Telefony_Osoba Telefony Column Name Data Type ID int NrTelefonu int TypNumeru varchar(50) IDOsoby int Allow Nulls Column Name Data Type ID int Imie varchar(100) DrugieImie varchar(100) Nazwisko varchar(100) Allow Nulls III. Stworzenie modelu a) Do katalogu Model dodajemy mapowanie LinqToSql. b) Następnie w tym samym katalogu proszę stworzyć klasę oraz interfejs zgodnie z kodem przedstawionym poniżej: public class OsobaModel { public int ID { get; set; } public string Imie { get; set; } public string DrugieImie { get; set; ; } public string Nazwisko { get; set; ; } } public interface IOsobaUslugi { List List<OsobaModel> ZwrocOsoby(); OsobaModel ZwrocOsobyWgID(int ID); void DodajOsobe(OsobaModel osoba); void EdytujOsobe(OsobaModel osoba); void UsunOsobe(OsobaModel osoba); } 3 Zaawansowane programowanie internetowe inter Instrukcja nr 3 Proszę następnie o zdefiniowanie klasy np. OsobaUslugi, OsobaUslugi która implementuje powyższy interfejs. d) Kolejnym krokiem, jest stworzenie podobnych klas dla tabeli Telefon. Jedna z klas powinna implementować poniższy interfejs: c) public interface ITelefonUslugi { List< <TelefonModel> > PobierzTelefonyDlaOsoby(int PobierzTelefonyDlaOsoby( IDOsoby); TelefonModel PobierzTelefonWgID(int ID); void DodajNumer(TelefonModel telefon); void EdytujNumer(TelefonModel telefon); void UsunNumer(TelefonModel telefon); } IV. Stworzenie kontrolerów a) Otwieramy twieramy okno Solution Explorer. b) Klikamy prawym przyciskiem myszy na katalogu „Controllers” „Controllers i wybieramy opcję Add > New Controller c) W wyświetlonym oknie dialogowym podajemy podajemy nazwę nowego kontrolera „OsobaController” Controller” oraz zaznaczamy opcję „Add action methods for Create, Update, Delete and Details scenarios”. Dzięki tej zaznaczeniu tej opcji Visual Vi Studio wygeneruje dla nas szablon dla podstawowych akcji pozwalających m. in. na dodwanie, edycję i usuwanie danych. 4 Zaawansowane programowanie internetowe inter Instrukcja nr 3 d) Kod wygenerowanej klasy przedstawia się następująco: public class OsobyController : Controller { public ActionResult Index() { return View(); } public ActionResult Details(int id) { return View(); } public ActionResult Create() { return View(); } [HttpPost HttpPost] public ActionResult Create(FormCollection FormCollection collection) { try { return RedirectToAction("Index"); ); } catch { return View(); } } public ActionResult Edit(int id) { return View(); } [HttpPost HttpPost] public ActionResult Edit(int id, FormCollection collection) { try ry { return RedirectToAction("Index"); ); } catch { return View(); } } public ActionResult Delete(int id) { return View(); } 5 Zaawansowane programowanie internetowe inter Instrukcja nr 3 [HttpPost HttpPost] public ActionResult Delete(int id, FormCollection collection) { try { return RedirectToAction("Index"); ); } catch { return View(); } } } Państwa zadaniem obecnie będzie wypełnienie poszczególnych metod, odpowiednim kodem. Należy zwrócić uwagę na fakt, że niektóre ni metody mają te same nazwy (np. ,). Pierwsza z nich ()) wywoływana jest przed danym działaniem (w tym przypadku stworzeniem stworzeniem artykułu) i ma za zadanie stworzenie oraz zwrócenie użytkownikowi odpowiedniego widoku widok (np. formularz do wprowadzania danych). danych). Druga jest wywoływana po przesłaniu przez prze użytkownika danych i w większości przypadków odpowiada za wywołanie funkcji modyfikującej zawartość bazy danych. Ponieważ onieważ akcje są wywoływane na podstawie nazwy, aby a możliwe było ich rozróżnienie konieczne jestt oznaczenie jednej z nich za pomocą atrybutu rozróżnienie, [HttpPost HttpPost]. Atrybut ten określa, że dana metoda może być wywołana tylko jeżeli żądanie zostało przesłane za pomocą metody POST. W przypadku, gdy metoda nie posiada tego atrybutu może być wywołana tylko jeżeli żądanie ż za pomocą metody GET. e) Proszę o zmodyfikowanie wygenerowanego szablonu zgodnie z kodem przedstawionym poniżej: public class OsobaController : Controller { IOsobaUslugi _osoby; ITelefonUslugi _telefony; public OsobaController() : this(new OsobaUslugi(), new TelefonUslugi()) TelefonUslugi { } public OsobaController( IOsobaUslugi osobaUslugi, ITelefonUslugi telefonyUslugi) { _osoby = osobaUslugi; _telefony = telefonyUslugi; } 6 Zaawansowane programowanie internetowe inter Instrukcja nr 3 public ActionResult Index() { ViewData["Osoby"] ] = _osoby.ZwrocOsoby(); return View(); } public ActionResult Details(int id) { OsobaModel osoba = _osoby.ZwrocOsobyWgID(id); ViewData["Imie"] ] = osoba.Imie; ViewData["DrugieImie"] ] = osoba.DrugieImie; ViewData["Nazwisko"] ] = osoba.Nazwisko; ViewData["ID"] = osoba.ID; ViewData["Telefony"] = _telefony.PobierzTelefonyDlaOsoby(id); return View(); } public ActionResult Create() { return View(); } [HttpPost] public ActionResult Create(OsobaModel OsobaModel osoba) { try { _osoby.DodajOsobe(osoba); return RedirectToAction("Index" "Index"); } catch { return View(); } } public ActionResult Edit(int id) { OsobaModel osoba = _osoby.ZwrocOsobyWgID(id); ViewData["Imie"] ] = osoba.Imie; ViewData["DrugieImie"] ] = osoba.DrugieImie; ViewData["Nazwisko"] ] = osoba.Nazwisko; ViewData["ID"] = osoba.ID; return View(); } 7 Zaawansowane programowanie internetowe inter Instrukcja nr 3 [HttpPost] public ActionResult Edit(int id, OsobaModel osoba) { try { _osoby.EdytujOsobe(osoba); return RedirectToAction("Index" "Index"); } catch { return View(); } } public ActionResult Delete(int id) { return View(); } [HttpPost] public ActionResult Delete(int id, FormCollection collection) { try { return RedirectToAction("Index" "Index"); } catch { return View(); } } } Słownik ViewData pozwala na przesyłanie danych pomiędzy kontrolerem i widokiem, który będzie tworzony w następnym punkcie. Słownik ten przechowuje obiekty typu object, tak więc w widoku konieczne będzie ich zrzutowanie na odpowiedni typ. Do metod, metod, których zadaniem jest przetwarzanie danych uzyskanych z formularzy HTML, wymagane informacje mogą być przekazane albo za pomocą kolekcji kolekcji typu FormCollection albo wykorzystać możliwości framework’a pozwalające na automatyczne zrzutowanie uzyskanych danych na odpowiedni typ danych. W przypadku kolekcji FormCollection FormCollec wszystkie informacje przekazywane są tylko w postaci tekstowej, tak więc odpowiednie konwersje należy wykonać samemu. Jeżeli skorzystamy z możliwości ASP.NET MVC Framework należy jedynie pamiętać, aby odpowiednie pola do wprowadzania danych w widoku nazywały się dokładnie tak jak właściwości obiektu przekazywanego jako param parametr. 8 Zaawansowane programowanie internetowe inter Instrukcja nr 3 V. Stworzenie widoków a) Mając otwarty kod kontrolera, który przygotowaliśmy w poprzednim punkcie proszę kliknąć prawym klawiszem myszy wewnątrz metody public ActionResult Edit(int id) i wybrać pozycję „Add View”. b) W wyświetlonym wyświetlonym okienku do generowania widoku poszczególne pola wypełniamy tak, jak na poniższym rysunku Kliknięcie przycisku Add spowoduje wygenerowanie odpowiedniego szablonu pliku z widokiem, który będzie korzystał z pliku zawierającego kod strony typu Master Page „~/Views/Shared/Site.Master ~/Views/Shared/Site.Master”. ”. Plik ten zostanie automatycznie umieszczony w odpowiednim katalogu. 9 Zaawansowane programowanie internetowe inter Instrukcja nr 3 c) W pliku z widokiem odszukujemy kontrolkę typu Content, której właściwość „ContentPlaceHolderID” ContentPlaceHolderID” jest ustawiona na wartość „MainContent”. d) Wewnątrz niej wystawiamy wystawiamy kod naszego formularza pozwalającego na edycję danych: <h2>Edit Edit</h2> <form enctype="application/x-www-form-urlencoded" enctype urlencoded" method method="post" action action="/Osoba/Edit/<%: ViewData["ID"] %>"> <input type="hidden" type name="ID" value="<%: :ViewData["ID"] %>"/> <fieldset fieldset> <div class="editor-field"> class <label label for="Imie">Imię</label> <input input type="text" name="Imie" value="<%: ViewData["Imie"] %>" "/> </div> <div class="editor-field"> class <label label for="DrugieImie">Drugie imię</label label> <input input type="text" name="DrugieImie" value="<%: ViewData["DrugieImie"] %>"/> </div> <div class="editor-field"> class <label label for="Nazwisko">Nazwisko</label> > <input input type="text" name="Nazwisko" value="<%: ViewData["Nazwisko"] %>"/> </div> <div class="editor-field"> clas <input input type="submit" value="OK" /> </div> </fieldset fieldset> </form> <div> <a href="/Osoba">Wróć href do listy osób</a a> </div> W powyższym kodzie należy zwrócić uwagę na dwa elementy: adresy w odnośnikach oraz sposób wstawiania danych przek przekazywanych do widoku z kontrolera. W połączeniach należy wprowadzać trasy w formacie /<nazwa kontrolera>/<nazwa akcji>/<parametry>, natomiast dane, które mają być wygenerowane na stronie powinno się umieszczać wewnątrz specjalnego zestawu znaczników „<%: %>”. e) Kolejnym krokiem, będzie stworzenie widoku dla akcji Index. W tym celu należy podjąć podobne kroki jak powyżej, wprowadzając oczywiście inny kod (w tym przypadku w instrukcji umieszczony jest kompletny kod strony): 10 Zaawansowane programowanie internetowe inter Instrukcja nr 3 <%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<dynamic>" %> Inherits="System.Web.Mvc.ViewPage<dynamic>" <%@ Import Namespace="Lab03.Models" %> <asp:Content Content ID="Content1" ContentPlaceHolderID ContentPlaceHolderID="TitleContent" runat="server"> Index </asp:Content Content> <asp:Content Content ID="Content2" ContentPlaceHolderID="MainContent" ContentPlaceHolderID runat runat="server"> <h2>Index Index</h2> <a href="/Osoba/Create/"> ="/Osoba/Create/">Dodaj Dodaj nową osobę</a> osobę <%if (((List<OsobaModel>)ViewData["Osoby" ((( "Osoby"]).Count > 0) {%> <table table> <tr> <th th>Imie</th> <th th>Nazwisko</th> <th th></th> </tr> > <% foreach (OsobaModel o in (List<OsobaModel>)ViewData[ >)ViewData["Osoby"]) { %> <tr> <td><%: o.Imie%></td> <td><%: o.Nazwisko%></td> <td> <a href="/Osoba/Details/<%: o.ID %>">Pokaż</a> <a href="/Osoba/Edit/<%: o.ID %>">Edytuj</a> </td> </ </tr> <%} } %> </table table> <%} else { %> <div> >Nie Nie wprowadzono jeszcze żadnych osób</div> osób <%} %> </asp:Content Content> Linijka ta odpowiada odpowiada za podłączenie do widoku wymaganej przestrzeni nazw. Jest to konieczne, ponieważ do widoku przekazujemy listę obiektów typu Osoba. Należy jednak pamiętać, że poprzez ViewData mogą być tylko przekazywane obiekty typu Object, należy więc dokonać odpowiedniego odpowiedniego rzutowania . Bez dołączenia przestrzeni klas w której znajduje się klasa Osoba, rzutowanie to nie było by możliwe. Sprawdzenie czy przekazana do widoku lista lista zawiera jakieś obiekty. Jeżeli tak, to generujemy tabelę osób. W przeciwnym przypadku przypadku generujemy komunikat „Nie wprowadzono jeszcze żadnych osób”. Należy zwrócić szczególną uwagę na zestaw znaczników, który został tu zastosowany „<% %>” Wewnątrz tych znaczników 11 Zaawansowane programowanie internetowe inter Instrukcja nr 3 umieszczamy wewnątrz widoku kod C#, który ma zostać wykonany, ale który sam nie generuje fragmentów wynikowego kodu strony WWW. Ten fragment kodu prezentuje w jaki sposób można w widoku przechodzić po kolekcji danych i dla każdego obiektu z tej kolekcji generować np. wiersz w tabeli. f) Proszę rozbudować stronę Master Page, aby możliwy był z niej dostęp do generowanej strony. Należy dołączyć do niej (np. jako pozycję menu) odnośnik do kontrolera „OsobaController” „Osob VI. Zadania do samodzielnego wykonania 1. 2. 3. 4. Proszę stworzyć pozostałe, brakujące widoki. a. Widok do akcji Create będzie bardzo podobny do widoku z akcji Edit. Nie będzie zawierał tylko fragmentów pozwalających na umieszczenie treści wewnątrz generowanych kontrolek. b. Widok dla akcji Details powinien wyświetlać szczegółowe informacje o osobie w tym odpowiednie adresy i numery telefonów. telefo Proszę dopisać kod brakujących akcji Delete. Proszę stworzyć kod pozwalający na dodawanie, modyfikowanie i usuwanie numerów telefonów i adresów. Dla każdego z tych elementów powinien być stworzony osobny kontroler i zestaw widoków. Jeżeli ktoś nie skończy skończy tworzenia tej aplikacji na zajęciach, bardzo proszę o dokończenie jej w domu i przyniesienie na następne laboratorium, gdyż będzie ona modyfikowana. 12 Zaawansowane programowanie internetowe inter Instrukcja nr 3