Microsoft.NET: ASP.NET MVC + Entity Framework (Model First)



Podobne dokumenty
Microsoft.NET: ASP.NET MVC + Entity Framework (Code First)

Microsoft.NET: ASP.NET MVC + Entity Framework (Code First)

ASP.NET MVC. Podstawy. Zaawansowane programowanie internetowe Instrukcja nr 3

Microsoft.NET: LINQ to SQL, ASP.NET AJAX

Zaawansowane aplikacje internetowe - laboratorium

Aplikacje internetowe i rozproszone - laboratorium

WYKORZYSTANIE WZORCA MVC W ASP.NET

Materiały oryginalne: ZAWWW-2st1.2-l11.tresc-1.0kolor.pdf. Materiały poprawione

Microsoft.NET: Warstwa dostępu do danych (DAL) w aplikacjach ASP.NET Web Forms

Laboratorium 7 Blog: dodawanie i edycja wpisów

2. Podstawy narzędzia Application Builder, budowa strony, kreatory aplikacji

Programowanie Obiektowe GUI

1 LINQ. Zaawansowane programowanie internetowe Instrukcja nr 1

4 AS SP.NET MVC. Widok. Zaawansowane programowanie internetowe Instrukcja nr 4

Aplikacje WWW - laboratorium

2. Podstawy narzędzia Application Builder, budowa strony, kreatory aplikacji

Web Services (SOAP) Ćwiczenie 1

Aplikacje WWW - laboratorium

Baza danych sql. 1. Wprowadzenie

Java EE: JSF + EJB + JPA

Zastępstwa Optivum. Jak przenieść dane na nowy komputer?

D:\DYDAKTYKA\ZAI_BIS\_Ćwiczenia_wzorce\04\04_poprawiony.doc 2009-lis-23, 17:44

Modele danych walidacja widoki zorientowane na model

Aplikacje internetowe laboratorium

Instrukcja laboratoryjna cz.6

Platformy Programowania

5 AS SP.NET MVC. Walidacja danych. Zaawansowane programowanie internetowe Instrukcja nr 5

Aplikacje internetowe - laboratorium ASP.NET praca z bazą danych

WYKONANIE APLIKACJI OKIENKOWEJ OBLICZAJĄCEJ SUMĘ DWÓCH LICZB W ŚRODOWISKU PROGRAMISTYCZNYM. NetBeans. Wykonał: Jacek Ventzke informatyka sem.

Sposoby tworzenia projektu zawierającego aplet w środowisku NetBeans. Metody zabezpieczenia komputera użytkownika przed działaniem apletu.

Korzystanie z edytora zasad grupy do zarządzania zasadami komputera lokalnego w systemie Windows XP

Aplikacje internetowe i rozproszone - laboratorium

Instrukcja laboratoryjna

3. Budowa prostych raportów opartych o bazę danych

5. Integracja stron aplikacji, tworzenie zintegrowanych formularzy i raportów

Zadanie 9. Projektowanie stron dokumentu

Aplikacje WWW - laboratorium

Jak przenieść bazę danych na zdalny serwer?

E:\DYDAKTYKA\ZAI\ZWWW\Laboratoria\L07\Java Persistence.doc 2011-lis-24, 17:0 Zaawansowane aplikacje internetowe Laboratorium Java Persistence.

Realizacja Aplikacji Internetowych 2013 laboratorium cz. 2 K.M. Ocetkiewicz

Microsoft.NET: ASP.NET Web Forms + Entity Framework (Database First)

Ćwiczenie dotyczące platformy Java EE zostało przygotowane z myślą o środowisku NetBeans w wersji 7.3 (do pobrania z

Enterprise JavaBeans (EJB)

Walidacja danych w ASP.NET MVC

PekaoBIZNES 24 Szybki START. Przewodnik dla Użytkowników z dostępem podstawowym

Poznaj ASP.NET MVC. Kamil Cieślak Microsoft Student Partner

Kadry Optivum, Płace Optivum. Jak przenieść dane na nowy komputer?

Informatyka I : Tworzenie projektu

16) Wprowadzenie do raportowania Rave

- Narzędzie Windows Forms. - Przykładowe aplikacje. Wyższa Metody Szkoła programowania Techniczno Ekonomiczna 1 w Świdnicy

Laboratorium 050. Crystal Reports. Ćwiczenie 1. Otwarte pozycje

Wstęp - Prosta aplikacja internetowa w technologii Java EE 5. Programowanie komponentowe 1

Aplikacja do podpisu cyfrowego npodpis

Oracle Application Express

Zadanie 11. Przygotowanie publikacji do wydrukowania

Zadanie 10. Stosowanie dokumentu głównego do organizowania dużych projektów

Inżynieria Programowania Laboratorium 3 Projektowanie i implementacja bazy danych. Paweł Paduch paduch@tu.kielce.pl

Aplikacje WWW - laboratorium

Zadanie 1. Stosowanie stylów

Tak przygotowane pliki należy umieścić w głównym folderze naszego programu. Klub IKS

Instrukcja składania wniosku o dofinansowanie w systemie informatycznym IP na potrzeby konkursu nr 1/1.1.2/2015

e-wsparcie Barbara Muszko Aktualizacja Twojej witryny internetowej tak prosta, jak obsługa Worda

Kostki OLAP i język MDX

Wprowadzenie do Doctrine ORM

Modelowanie obiektowe - Ćw. 1.

pue.zus.pl ZUS PRZEZ INTERNET KROK PO KROKU ZGŁOSZENIE NOWEGO PRACOWNIKA

6. Formularze tabelaryczne, obiekty nawigacji - rozgałęzienia

Marketing Automation:

6. Powtórz kroki z punktu 5. dla strony sorry.jsp, zmieniając jedynie treść wyświetlanego tekstu ( Niestety zamiast Witaj )

Logowanie do aplikacji TETA Web. Instrukcja Użytkownika

Politechnika Gdańska Katedra Optoelektroniki i Systemów Elektronicznych

Karty pracy. Ustawienia. W tym rozdziale została opisana konfiguracja modułu CRM Karty pracy oraz widoki i funkcje w nim dostępne.

Zasady tworzenia podstron

Zaawansowane aplikacje internetowe - laboratorium Architektura CORBA.

Kadry Optivum, Płace Optivum

Zaawansowane aplikacje internetowe laboratorium REST

Projektowanie aplikacji internetowych laboratorium

1. Doradcy Logowanie i Pulpit Mój profil Moje kwalifikacje Moi klienci Szczegóły klientów...

Systemy baz danych Prowadzący: Adam Czyszczoń. Systemy baz danych. 1. Import bazy z MS Access do MS SQL Server 2012:

Instrukcja instalacji nośników USB w systemie internetowym Alior Banku

UONET+ - moduł Sekretariat

Projektowanie baz danych za pomocą narzędzi CASE

1. Przypisy, indeks i spisy.

BAZY DANYCH Panel sterujący

Systemy operacyjne. Zasady lokalne i konfiguracja środowiska Windows 2000

Aplikacje WWW - laboratorium

Scenariusz lekcji. Scenariusz lekcji 1 TEMAT LEKCJI: 2 CELE LEKCJI: 2.1 Wiadomości: 2.2 Umiejętności: 3 METODY NAUCZANIA: 4 ŚRODKI DYDAKTYCZNE:

Uruchomienie aplikacji Plan lekcji w przeglądarce Internet Explorer

Programowanie obiektowe

Pracownia internetowa w każdej szkole (edycja Jesień 2007)

Zaawansowane aplikacje internetowe - laboratorium Web Services (część 1).

Repozytorium Cyfrowe BN

Pracownia internetowa w szkole ZASTOSOWANIA

Programowanie komponentowe. Przykład 1 Bezpieczeństwo wg The Java EE 5 Tutorial Autor: Zofia Kruczkiewicz

8. Listy wartości, dodatkowe informacje dotyczące elementów i przycisków

Plan. Raport. Tworzenie raportu z kreatora (1/3)

Access - Aplikacja. Tworzenie bazy danych w postaci aplikacji

Nowy projekt: - ASP.NET MVC 3 Web Application - [Other Languages] Visual C# Web ASP.NET MVC 3 Web Application - okno dialogowe:

Transkrypt:

Microsoft.NET: ASP.NET MVC + Entity Framework (Model First) Do realizacji projektu potrzebne jest zintegrowane środowisko programistyczne Microsoft Visual Studio 2012. W ramach projektu budowana jest prosta aplikacja ASP.NET MVC 4 do ogłaszania informacji o podróżach samochodowych w celu znalezienia współuczestników podróży do partycypacji w kosztach. Dla uproszczenia w projekcie pominięte są kwestie autoryzacji dostępu przy korzystaniu z serwisu. Model bazy danych dla aplikacji będzie tworzony zgodnie ze strategią Model First. Kroki ćwiczenia: 1. Utworzenie nowego projektu (Web Project). a) Uruchom narzędzie Microsoft Visual Studio jeśli nie jest jeszcze uruchomione. b) Z menu głównego wybierz File New Project. Wybierz szablon ASP.NET MVC 4 Web Application z kategorii Visual C# -> Web. Jako nazwę projektu podaj TravelMates. Pozostałe opcje pozostaw domyślne i kliknij przycisk OK. c) W kolejnym kroku kreatora jako szablon projektu MVC 4 wybierz Internet Application. Upewnij się, że jako silnik widoków wybrany jest Razor (sprawdź jakie inne opcje są do wyboru). Nie zaznaczaj opcji tworzenia projektu dla testów jednostkowych.

d) Obejrzyj strukturę projektu w panelu Solution Explorer zwracając uwagę na utworzone przez kreator foldery. e) Obejrzyj kod startowy aplikacji w pliku Global.asax.cs. Odszukaj w folderze App_Start plik zawierający reguły routingu dla aplikacji i obejrzyj jego zawartość. f) Uruchom projekt kombinacją klawiszy Ctrl+F5. g) Przetestuj nawigację po stronach aplikacji zwracając uwagę na zawartość paska adresu w przeglądarce. h) Zarejestruj się do aplikacji (tj. utwórz nowe konto) klikając Log On, a następnie Register. i) Odszukaj kod strony odpowiedzialny za wyświetlanie linku umożliwiającego logowanie lub nazwę użytkownika z możliwością wylogowania się. Sprawdź w jaki sposób można uzyskać w kodzie strony informację o zalogowanym użytkowniku (obejrzyj kod stosownego fragmentu widoku). 2. Utworzenie obiektowego modelu danych w projekcie i odwzorowanie go na schemat bazy danych a) W panelu Solution Explorer wywołaj prawym klawiszem myszy menu kontekstowe dla projektu i wybierz opcję Add -> New Item. Wybierz opcję tworzenia modelu danych

encji Entity Framework (ADO.NET Entity Data Model) jako nazwę jego pliku podając TravelMates.edmx. b) W wywołanym kreatorze modelu danych wybierz opcję Empty Model i kliknij Finish.

c) W automatycznie otwartym do edycji w trybie graficznym modelu danych umieść na diagramie nową encję przeciągając ją z palety (Toolbox). d) Zaznacz encję na diagramie i poprzez paletę właściwości (Properties) ustaw nazwę encji na Trip, a następnie nazwę zbioru instancji encji na Trips e) Obejrzyj właściwości atrybutu Id zwracając uwagę na ustawienie automatycznej generacji wartości tego atrybutu w bazie danych. f) Korzystając z opcji menu kontekstowego Add->Scalar Property dodaj do encji Trip następujące właściwości zgodnie z poniższą tabelką:

Name Nullable Type FromCity False String ToCity False String StartDate False DateTime OrganizedBy True String PhoneNumber False String g) Zapisz projekt. Następnie z poziomu diagramu encji wywołaj menu kontekstowe i wybierz opcję Generate Database from Model.

h) W oknie kreatora, które się pojawi kliknij New Connection. W ustawieniach nowego połączenia jako źródło podaj Microsoft SQL Server Database File, a następnie kliknij przycisk Browse. Zleć utworzenie nowego pliku bazy danych przechodząc do katalogu, w którym masz prawo zapisu, jako nazwę pliku podając TripsXXXXX, gdzie XXXXX to Twój numer indeksu. Rozszerzenie *.mdf pliku zostanie nadane automatycznie. Kliknij OK i w okienku, które się pojawi, potwierdź decyzję o utworzeniu nowego pliku bazy danych.

i) Po powrocie do głównego okna kreatora kliknij Next. j) W drugim kroku kreatora obejrzyj wygenerowany skrypt i kliknij Finish. k) Zapisz wszystkie zmiany. Wróć do modelu encji. Obejrzyj odwzorowanie encji na tabelę (w oknie Mapping Details). Następnie obejrzyj kod źródłowy klasy encji. 3. Uruchomienie skryptu SQL w bazie danych. Komentarz: Z pozoru nic prostszego Visual Studio umożliwia uruchomienie skryptu otwartego w edytorze poprzez wywołanie menu kontekstowego i wybranie z niego opcji Execute SQL. Niestety uruchomienie skryptu SQL w dołączonym pliku bazy danych z poziomu Visual Studio jest problematyczne. Ponieważ nasz skrypt zawiera właściwie dwa polecenia SQL, uruchomimy je na pliku bazy danych jedno po drugim, w pewnym sensie omijając ograniczenia Visual Studio. a) Z menu kontekstowego węzła pliku bazy danych w panelu Server Explorer wybierz opcję New Query. Zamknij okno dialogowe z prośbą o wybór obiektów, na których ma operować tworzone zapytanie. b) Skopiuj ze skryptu treść polecenia CREATE TABLE i wklej polecenie do okna edytora zapytania. c) Uruchom polecenie SQL, np. klikając odpowiednią ikonę w pasku narzędziowym. d) Powtórz kroki b) i c) dla polecenia ALTER TABLE ze skryptu.

4. Wprowadzenie przykładowych danych do tabeli. a) Przejdź do panelu Server Explorer. Poprzez odpowiednie połączenie z bazą danych odszukaj utworzoną w bazie danych tabelę na którą odwzorowana jest encja Trip. Przejdź do podglądu danych tabeli. b) Wprowadź do tabeli dwa przykładowe wiersze 5. Utworzenie kontrolerów i widoków do przeglądania informacji o zgłoszonych podróżach. a) Z menu kontekstowego dla folderu Controllers w panelu Solution Explorer wybierz opcję Add->Controller. Jako jego nazwę podaj TripsController, a jako szablon scaffoldingu wybierz MVC controller with empty read/write actions (celowo nie wybierzemy kontrolera, który tworzy również widoki, aby przećwiczyć ich ręczne dodawanie).

b) Obejrzyj kod wygenerowanego kontrolera. Zwróć uwagę na komentarze wskazujące przewidywany sposób wywoływania poszczególnych akcji kontrolera. Odszukaj atrybuty metod reprezentujących akcje wywoływane inną metodą HTTP niż GET. Zauważ że dla operacji edycji, dodawania i usuwania kreator wygenerował pary metod o tej samej nazwie: jedna dla metody GET, a druga dla POST. Zastanów się która będzie uruchamiana jako pierwsza i która wykona rzeczywistą operację modyfikacji modelu. c) Zastąp ciało metody Index utworzonego kontrolera poniższym kodem. var trips = db.trips; return View(trips); d) Zapisz wszystkie zmiany, a następnie przebuduj projekt wybierając opcję Rebuild z menu kontekstowego węzła projektu w oknie Solution Explorer. e) Pozostając w edytorze kodu kontrolera wywołaj menu kontekstowe z poziomu sygnatury metody Index i wybierz z niego opcję Add View. Pozostaw zaproponowaną nazwę widoku. (Dzięki temu, że jest taka sama jak nazwa akcji kontrolera, metoda akcji zwracająca widok nie musi podawać jawnie jego nazwy.) Zaznacz, że widok ma być silnie typowany. Jako klasę modelu wybierz klasę encji Trip. Jako szablon scaffoldingu wybierz List. Pozostaw zaproponowane ustawienia dotyczące strony wzorcowej.

f) Obejrzyj kod wygenerowanego widoku. Zapisz wszystkie zmiany. Uruchom aplikację. Wprowadź w pasku adresu przeglądarki adres prowadzący do listy podróży. g) Przejdź do edycji strony wzorcowej. Zmień nagłówek na Travel Mates i dodaj pozycję menu prowadzącą do listy podróży (wzoruj się na istniejących już trzech pozycjach menu). Ponownie uruchom i przetestuj aplikację. h) Wróć do edycji kodu kontrolera i zastąp ciało metody Details poniższym kodem. var trip = db.trips.firstordefault(t => t.id == id); i) Tym samym sposobem co poprzednio utwórz silnie typowany widok, który będzie prezentował szczegółowe informacje na temat podanej podróży. W kreatorze jako zawartość widoku podaj Details. j) Uruchom aplikację i podejrzyj szczegóły o podróżach. k) Zmodyfikuj adres w przeglądarce, aby sprawdzić co się stanie przy próbie podejrzenia szczegółów na temat podróży o nieistniejącym identyfikatorze. l) Zastąp ciało akcji Details w kontrolerze poniższym kodem. var trip = db.trips.firstordefault(t => t.id == id); if (trip == null) ViewBag.BadId = id; return View("NotFound"); else m) Utwórz kolejny widok dla akcji Details. Nazwij go NotFound. Tym razem widok nie będzie silnie typowany. (Dlatego kontroler przekazuje mu dane przez słownik ViewBag, a nie obiekt modelu.)

n) W kodzie dodanej właśnie strony widoku zastąp tytuł strony przez Trip not found, a jej zawartość przez: <h2>trip @ViewBag.BadId does not exist.</h2> o) Zapisz zmiany. Uruchom aplikację. Sprawdź co się stanie przy próbie obejrzenia informacji o nieistniejącej podróży. 6. Obsługa dodawania nowych podróży. a) Zastąp ciało akcji Create (wołanej przez GET) w kontrolerze poniższym kodem. Gdy użytkownik jest zalogowany, jego nazwa pojawi się domyślnie jako organizator podróży. Trip trip = new Trip(); if (HttpContext.User!= null) trip.organizedby = HttpContext.User.Identity.Name; b) Zastąp parametr akcji Create (wołanej przez POST) przez trip typu Trip. Dzięki temu framework MVC przekaże do metody gotowy obiekt encji z danymi z formularza (bez tej modyfikacji, w ciele metody konieczne by było ręczne utworzenie takiego obiektu i wypełnienie go przekazanymi jako parametr danymi z formularza).

c) Zastąp ciało akcji Create (wołanej przez POST) w kontrolerze poniższym kodem. try if (ModelState.IsValid) db.trips.add(trip); db.savechanges(); return RedirectToAction("Index"); catch d) Utwórz kreatorem stronę widoku do wprowadzania danych o nowej podróży. Wywołaj kreator z poziomu kodu akcji kontrolera Create wołanej przez GET. W kreatorze jako zawartość widoku podaj Create. e) Zapisz zmiany. Uruchom aplikację i przetestuj dodawanie informacji o nowych podróżach. Sprawdź czy gdy użytkownik jest zalogowany, automatycznie wypełnia się pole organizatora podróży. UWAGA: Podczas wprowadzania danych zwróć uwagę na kompletność informacji i format daty. Ponieważ nie zaimplementowaliśmy jeszcze walidacji na poziomie aplikacji ani obsługi błędów przy interakcji z bazą danych, przy niekompletnych lub niepoprawnych danych ponownie przedstawiany jest formularz bez żadnych informacji o przyczynach niezapisania danych do bazy. 7. ZADANIA DODATKOWE DLA CHĘTNYCH: a) Zaimplementuj obsługę edycji informacji o podróżach. b) Zaimplementuj obsługę usuwania informacji o podróżach (W tym wypadku najpierw wyświetlana powinna być strona z prośbą o potwierdzenie decyzji.) 8. Obsługa błędów zwracanych przez bazę danych. a) W sekcji obsługi wyjątku metody Create wołanej przez POST dodaj poniższy wiersz (to samo dla metody Edit wołanej przez POST). ViewBag.ErrorMessage = "Nie udało się zapisać danych. Sprawdź czy data jest poprawna."; b) W sekcji obsługi wyjątku metody Delete wołanej przez POST dodaj poniższy wiersz. ViewBag.ErrorMessage = "Nie udało się usunąć danych. Sprawdź czy dane nie zostały usunięte przez innego użytkownika."; c) Na końcu treści stron widoków Create, Edit i Delete umieść poniższy element wyświetlający przekazywany komunikat o błędzie. <p class="error">@viewbag.errormessage</p>

d) Przetestuj zachowanie aplikacji przy próbie dodania informacji dla roku 0001. 9. Walidacja danych na poziomie modelu poprzez adnotacje. UWAGA: Ponieważ wykorzystując Entity Framework nie zastosowaliśmy strategii Code First, nie możemy umieścić adnotacji bezpośrednio przy atrybutach klasy encji. Kod tej klasy został wygenerowany na podstawie graficznego modelu i nie powinien być zmieniany ręcznie przez programistę. Wykorzystamy więc mechanizm klas częściowych i klasę metadanych powiązaną z klasą encji a) Dodaj w katalogu Models klasę częściową Trip bez ciała. Możesz użyć w tym celu kreator Add->Class. Zwróć uwagę aby klasa była umieszczona w tej samej przestrzeni nazw co klasa częściowa Trip wygenerowana przez kreator. b) W tym samym pliku źródłowym i w tej samej przestrzeni nazw umieść poniższą klasę metadanych. Obejrzyj zawarte w niej adnotacje i zaimportuj dla nich odpowiednie przestrzenie nazw. public class TripMetaData public object Id get; set; [Required] public object FromCity get; set; [Required] public object ToCity get; set; [Required] [DataType(DataType.Date)] public object StartDate get; set; [Required] [StringLength(30, MinimumLength = 2)] public object OrganizedBy get; set; [Required] public object PhoneNumber get; set; c) Definicję dodanej w punkcie a) klasy częściowej poprzedź poniższą adnotacją aby powiązać klasę encji z klasą metadanych. [MetadataType(typeof(TripMetaData))] d) Obejrzyj w kodzie stron widoków do edycji i dodawania danych elementy odpowiedzialne za wyświetlanie błędów walidacji na poziomie komponentów modelu. e) Uruchom aplikację i przetestuj wszystkie dodane mechanizmy walidacji dodając lub edytując wycieczki.

DODATEK Kompletny przykładowy kod kontrolera implementowanego w tutorialu. using System; using System.Collections.Generic; using System.Data; using System.Linq; using System.Web; using System.Web.Mvc; namespace TravelMates.Controllers public class TripsController : Controller // GET: /Trips/ public ActionResult Index() var trips = db.trips; return View(trips); // GET: /Trips/Details/5 public ActionResult Details(int id) var trip = db.trips.firstordefault(t => t.id == id); if (trip == null) ViewBag.BadId = id; return View("NotFound"); else // GET: /Trips/Create public ActionResult Create() Trip trip = new Trip(); if (HttpContext.User!= null) trip.organizedby = HttpContext.User.Identity.Name;

// POST: /Trips/Create [HttpPost] public ActionResult Create(Trip trip) try if (ModelState.IsValid) db.trips.add(trip); db.savechanges(); return RedirectToAction("Index"); catch ViewBag.ErrorMessage = "Nie udało się zapisać danych. Sprawdź czy data jest poprawna."; // GET: /Trips/Edit/5 public ActionResult Edit(int id) Trip trip = db.trips.firstordefault(t => t.id == id); if (trip == null) ViewBag.BadId = id; return View("NotFound"); else // POST: /Trips/Edit/5 [HttpPost] public ActionResult Edit(Trip trip) try if (ModelState.IsValid) db.entry(trip).state = EntityState.Modified; db.savechanges(); return RedirectToAction("Index"); catch ViewBag.ErrorMessage = "Nie udało się zapisać danych. Sprawdź czy data jest poprawna.";

// GET: /Trips/Delete/5 public ActionResult Delete(int id) Trip trip = db.trips.firstordefault(t => t.id == id); if (trip == null) ViewBag.BadId = id; return View("NotFound"); else // POST: /Trips/Delete/5 [HttpPost, ActionName("Delete")] // Ustawiamy ActionName aby metoda mogla nazywac sie // inaczej niz Delete wywolywane przez GET // nie moze byc dwoch metod Delete o tej samej sygnaturze // inne wyjscie to drugi nieuzywany parametr FormCollection public ActionResult DeleteConfirmed(int id) Trip trip = db.trips.firstordefault(t => t.id == id); try db.trips.remove(trip); db.savechanges(); return RedirectToAction("Index"); catch ViewBag.ErrorMessage = "Nie udało się usunąć danych. Sprawdź czy dane nie zostały usunięte przez innego użytkownika.";