Zarządzanie stanem w aplikacjach ASP.NET



Podobne dokumenty
Technologia WebParts

Aplikacje Internetowe

1 LINQ. Zaawansowane programowanie internetowe Instrukcja nr 1

Dodaj do kontrolki MultiView dwie kontrolki View, nazywając je po kolei: ankietaglowna i podsumowanie.

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

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

Infrastruktura aplikacji WWW

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

Politechnika Poznańska Wydział Budowy Maszyn i Zarządzania

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

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

Dostęp do baz danych w ASP.NET.

Tworzenie i wykorzystanie usług sieciowych

Programowanie obiektowe

Zaawansowane aplikacje internetowe - laboratorium

ITA-103 Aplikacje Internetowe. Piotr Bubacz. Moduł 9. Wersja 1. LINQ w ASP.NET

Ćwiczenia 9 - Swing - część 1

Programowanie obiektowe i zdarzeniowe wykład 4 Kompozycja, kolekcje, wiązanie danych

Aplikacje Internetowe

Zaawansowane aplikacje WWW - laboratorium

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

LK1: Wprowadzenie do MS Access Zakładanie bazy danych i tworzenie interfejsu użytkownika

Instrukcja laboratoryjna cz.2

Modelowanie obiektowe - Ćw. 1.

Politechnika Gdańska Katedra Optoelektroniki i Systemów Elektronicznych

ITA-103 Aplikacje Internetowe. Piotr Bubacz. Moduł 13. Wersja 1 ASP.NET AJAX

Aplikacje WWW - laboratorium

Sesje, ciasteczka, wyjątki. Ciasteczka w PHP. Zastosowanie cookies. Sprawdzanie obecności ciasteczka

Rys. 3. Kod elementów na stronie po dodaniu kontrolek podstawowych.

Kontrola sesji w PHP HTTP jest protokołem bezstanowym (ang. stateless) nie utrzymuje stanu między dwoma transakcjami. Kontrola sesji służy do

Narzędzia i aplikacje Java EE. Usługi sieciowe Paweł Czarnul pczarnul@eti.pg.gda.pl

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

Aplikacje WWW. Laboratorium z przedmiotu Aplikacje WWW - zestaw 01

Wprowadzenie do ASP.NET

Wprowadzenie do programowania w języku Visual Basic. Podstawowe instrukcje języka

Programowanie obiektowe

Obiektowy PHP. Czym jest obiekt? Definicja klasy. Składowe klasy pola i metody

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

Prosta książka telefoniczna z wykorzystaniem zapisu do pliku

Laboratorium 10 - Web Services

Zadanie 1. Tworzenie nowej "strony sieci WEB". Będziemy korzystad ze stron w technologii ASP.NET.

Laboratorium 7 Blog: dodawanie i edycja wpisów

Platforma.NET laboratorium 4 Aktualizacja: 15/11/2013. Visual Basic.NET dostęp do bazy danych. Baza Microsoft SQL Server Compact

Aplikacje internetowe i rozproszone - laboratorium

Wykład 12. Programowanie serwera MS SQL 2005 w C#

akademia androida Składowanie danych część VI

Aplikacje internetowe - laboratorium

Budowa aplikacji wielowarstwowych zastosowanie szablonów. Laboratorium 2 Programowanie komponentowe Zofia Kruczkiewicz

Aplikacje internetowe i rozproszone - laboratorium

Aplikacje WWW - laboratorium

Projektowanie serwisów internetowych

Programowanie obiektowe

LINQ TO XML. Autor ćwiczenia: Marcin Wolicki

Ćwiczenie 8. Kontrolki serwerowe

Soneta Sp. z o.o. Standardowe kreatory CRM

Leszek Stasiak Zastosowanie technologii LINQ w

Programowanie obiektowe

Modele danych walidacja widoki zorientowane na model

Laboratorium 1 - Programowanie proceduralne i obiektowe

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

Walidacja danych w ASP.NET MVC

Wykład 5 Okna MDI i SDI, dziedziczenie

SZYBKI START. Tworzenie nowego połączenia w celu zaszyfrowania/odszyfrowania danych lub tekstu 2. Szyfrowanie/odszyfrowanie danych 4

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

Utworzenie aplikacji mobilnej Po uruchomieniu Visual Studio pokazuje się ekran powitalny. Po lewej stronie odnośniki do otworzenia lub stworzenia

Laboratorium 1. Wzorce oprogramowania lab1, Zofia Kruczkiewicz

LINQ TO SQL w dużym skrócie jest to zintegrowany język zapytao pozwalający na mapowanie relacyjnych baz danych na model obiektowy.

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

xmlns:prism= c. <ContentControl prism:regionmanager.regionname="mainregion" />

Programowanie Obiektowe GUI

SPIS TREŚCI. Sposób pierwszy... 3 Sposób drugi Ikony banków Ikony dostawców Strona1

Dokumentacja Użytkownika Systemu

Kontrolki danych w ASP.NET

Wykład 3 Inżynieria oprogramowania. Przykład 1 Bezpieczeństwo(2) wg The Java EE 5 Tutorial Autor: Zofia Kruczkiewicz

Projektowanie aplikacji internetowych laboratorium

Wprowadzenie do Doctrine ORM

Kurs walut. Specyfikacja projektu. Marek Zając

Miejski System Zarządzania - Katowicka Infrastruktura Informacji Przestrzennej

Programowanie wielowarstwowe i komponentowe

Aktualizacja SMSFall v Data publikacji:

ASP.NET AJAX Control Toolkit

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

Instrukcja laboratoryjna cz.3

Enterprise JavaBeans (EJB)

Wykład 8: klasy cz. 4

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

Klasy i obiekty cz II

Wprowadzenie do programowania w języku Visual Basic. Podstawowe instrukcje języka

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

Bazy danych dla producenta mebli tapicerowanych. Bartosz Janiak Marcin Sikora Wrocław r.

INSTRUKCJA INSTALACJI APLIKACJI PROF- EAN 2

Zaawansowane aplikacje internetowe laboratorium REST

Wstęp. Skąd pobrać program do obsługi FTP? Logowanie

Programowanie obiektowe

Aplikacja do podpisu cyfrowego npodpis

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

Wybieramy File->New->Project Wybieramy aplikację MFC->MFC Application jak na rysunku poniżej:

Transkrypt:

Piotr Bubacz Moduł 11 Wersja 1 Zarządzanie stanem w aplikacjach ASP.NET Spis treści... 1 Informacje o module... 2 Przygotowanie teoretyczne... 3 Przykładowy problem... 3 Podstawy teoretyczne... 3 Uwagi dla studenta... 4 Dodatkowe źródła informacji... 4 Laboratorium podstawowe... 6 Problem 1 (czas realizacji 5 min)... 6 Problem 2 (czas realizacji 15 min)... 7 Problem 3 (czas realizacji 25 min)... 9

Informacje o module Opis modułu W tym module znajdziesz informacje dotyczące możliwości zarządzania stanem w aplikacjach ASP.NET. Nauczysz się przechowywad zmienne i obiekty w stanie sesji i aplikacji. Zobaczysz, w jaki sposób można dodawad, zarządzad i usuwad obiekty z tych stanów. Cel modułu Celem modułu jest przedstawienie możliwości wykorzystania stanu aplikacji i sesji do przechowywania zmiennych i obiektów. Uzyskane kompetencje Po zrealizowaniu modułu będziesz: rozumiał potrzebę przechowywania wybranych informacji w stanie aplikacji i sesji potrafił dodawad zmienne i obiekty do stanu sesji i aplikacji wiedział jak utworzyd obiekty i zmienne przy starcie aplikacji i sesji Wymagania wstępne Przed przystąpieniem do pracy z tym modułem powinieneś: znad podstawy języka XHTML znad zasady pracy w środowisku Visual Studio, w szczególności tworzenia stron internetowych Mapa zależności modułu Zgodnie z mapą zależności przedstawioną na Rys. 1, przed przystąpieniem do realizacji tego modułu należy zapoznad się z materiałem zawartym w modułach Podstawy HTML i Wprowadzenie do ASP.NET. MODUŁ 14 MODUŁ 13 MODUŁ 1 MODUŁ 12 MODUŁ 2 MODUŁ 10 MODUŁ 11 MODUŁ 3 MODUŁ 9 MODUŁ 4 MODUŁ 8 MODUŁ 6 MODUŁ 5 Rys. 1 Mapa zależności modułu Strona 11-2

Przygotowanie teoretyczne Przykładowy problem Tworząc aplikacje internetową większośd informacji przechowujemy w bazie danych. Czasami wykorzystujemy pliki XML. Jednak są sytuacje, kiedy potrzebujemy szybkiego narzędzia do przechowywania i zarządzania danymi. Jeśli implementujemy koszyk zakupów czy licznik na stronie, to zapisywanie ich do bazy czy pliku XML jest zbyt długie. Do tego celu musimy wykorzystad inny mechanizm. Podstawy teoretyczne W aplikacjach ASP.NET często zachodzi potrzeba przechowywania stanu, np. pomiędzy żądaniami pojedynczego użytkownika. Niestety protokół HTTP, z pomocą którego realizowana jest komunikacja klienta z serwerem, jest bezstanowy. Oznacza to, że HTTP nie pozwala określid, czy dwa żądania zostały wykonane przez tego samego, czy przez dwóch różnych użytkowników. Każde nowe żądanie jest traktowane tak, jakby pochodziło od zupełnie nowego użytkownika. W poprzednich modułach pokazana została możliwośd przekazywania informacji pomiędzy stronami w postaci parametrów wywołania, metoda ta ma jednak wiele wad. Podstawową z nich jest małe bezpieczeostwo tak przekazywanych informacji, a także ograniczenie ilości danych, jakie mogą zostad przesłane. Stan obiektu tworzą: jego konfiguracja, atrybuty, warunki lub informacje o zawartości. W aplikacjach internetowych stan jest ulotny i ograniczony do wygenerowania dokumentu po stronie serwera i przesłania go do użytkownika. W ASP.NET istnieje wiele mechanizmów przechowywania i zarządzania stanem, które można podzielid ze względu na kilka kryteriów: zasięg, czas życia i dopuszczalny rozmiar przechowywanych danych oraz po jakiej stronie są przechowywane. Wśród mechanizmów pozwalających zarządzad stanem indywidualnie dla każdego użytkownika wymienid można: parametry wywołania i pliki cookies po stronie klienta oraz stan strony (ViewState), stan sesji i stan aplikacji po stronie serwera. Przykładem informacji, która powinna byd przechowywana w stanie sesji, jest zawartośd koszyka zakupów użytkownika, w stanie aplikacji możemy z kolei przechowywad np. informacje o liczbie odwiedzin naszej strony. Stan aplikacji Współdzielenie informacji w całej aplikacji jest możliwe przy użyciu klasy HttpApplicationState. Klasa ta pozwala przechowywad zmienne w słowniku kolekcji par klucz-wartośd. Zmienne te są widoczne w obszarze całej aplikacji ASP.NET. Używając stanu aplikacji do przechowywania obiektów musisz wziąd pod uwagę kilka istotnych kwestii: Zasoby ponieważ stan aplikacji jest przechowywany w pamięci, mamy do niego szybki dostęp, w odróżnieniu od danych na dysku czy w bazie danych. Niestety przechowywanie dużych bloków danych w stanie aplikacji może wypełnid pamięd serwera i spowodowad zapisywanie pamięci na dysku. Ulotnośd ponieważ stan aplikacji jest przechowywany w pamięci, jest usuwany z niej w momencie zatrzymania lub restartu aplikacji lub w momencie awarii serwera. Skalowalnośd stan aplikacji nie jest dzielony na serwery w farmie serwerów, więc jeśli Twoja aplikacja ma działad w środowisku wielu serwerów, to nie powinieneś wykorzystywad stanu aplikacji. Współbieżnośd do stanu aplikacji może jednocześnie odwoływad się wiele wątków, dlatego ważne jest zapewnienie mechanizmów bezpiecznej aktualizacji przechowywanych obiektów. Tworzenie zmiennych stanu aplikacji jest możliwe poprzez obiekt Application. Przykład utworzenia zmiennych aplikacji o nazwach info i AppStartTime: Strona 11-3

Application["info"] = "Witaj świecie"; Application["AppStartTime"] = DateTime.Now; Pobranie wartości tak utworzonej zmiennej stanu sesji można zrealizowad za pomocą następującej konstrukcji: Stan sesji string info = (string) Application["info"]; DateTime AppStartTime = (DateTime) Application["AppStartTime"]; Tworzenie zmiennych stanu sesji jest możliwe poprzez obiekt Session. Przykład utworzenia nowej zmiennej stanu sesji o nazwie info, przechowującej łaocuch znaków o treści Witaj świecie! : Session["info"] = "Witaj świecie!"; Pobranie wartości tak utworzonej zmiennej stanu sesji można zrealizowad za pomocą następującej konstrukcji: string info = (string) Session["info"]; Przechowywanie i pobieranie złożonych danych, tj. obiektów, wymaga rzutowania do odpowiedniego typu. Przykład zapisania obiektu typu Koszyk w zmiennej stanu sesji: koszyk = new Koszyk(); Session["koszyk"] = koszyk; Przykład odczytu zmiennej stanu sesji typu Koszyk: koszyk = (Koszyk) Session["koszyk"]; Global Application Class Plik Global.asax umożliwia deklarowanie i zarządzanie zdarzeniami na poziomie aplikacji i sesji. Jest on umieszczony w głównym katalogu aplikacji. Podczas wykonywania plik jest parsowany i kompilowany w dynamiczną klasę dziedziczoną z klasy bazowej HttpApplication. Podsumowanie W tym rozdziale przedstawione zostały podstawy pracy ze stanem sesji i aplikacji. Uwagi dla studenta Jesteś przygotowany do realizacji laboratorium jeśli: potrafisz dodawad, odczytywad, zmieniad i usuwad obiekty ze stanu sesji i aplikacji wiesz do czego służy i co zawiera plik Global.asax Pamiętaj o zapoznaniu się z uwagami i poradami zawartymi w tym module. Upewnij się, że rozumiesz omawiane w nich zagadnienia. Jeśli masz trudności ze zrozumieniem tematu zawartego w uwagach, przeczytaj ponownie informacje z tego rozdziału i zajrzyj do notatek z wykładów. Dodatkowe źródła informacji 1. Design and Implementation Guidelines for Web Clients, http://msdn2.microsoft.com/enus/library/ms978622.aspx Zespół patterns & practices przygotował wskazówki dotyczące planowania, implementacji i zarządzania stanem w aplikacjach ASP.NET. Na stronie znajdziesz dobre praktyki zarządzania stanem. 2. ASP.NET Application State, http://msdn.microsoft.com/en-us/library/bf9xhdz4.aspx Na stronie przedstawiono szczegółowe informacje dotyczące zarządzania stanem w aplikacjach ASP.NET. Strona 11-4

3. Randy Connolly, ASP.NET 2.0. Projektowanie aplikacji internetowych, Helion, 2008 W książce autor szczegółowo porusza kwestie związane ze stanem sesji. Znajdziesz tu m.in. informacje dotyczące dostawców stanu sesji. 4. Stephen Walther, ASP.NET 2.0. Księga eksperta, Helion, 2007 W książce autor przedstawił informacje związane z wykorzytsaniem stanu sesji i aplikacji. Znajdziesz tu m.in. informacje dotyczące używania stanu sesji bez wykorzystywania mechanizmu cookies. Strona 11-5

Laboratorium podstawowe Problem 1 (czas realizacji 5 min) Już jesteś na ukooczeniu strony. Twój klient jednak ciągle dodaje coś nowego do funkcjonalności. Teraz postanowił sprawdzad ilośd osób odwiedzających jego stronę. Musisz zaimplementowad licznik, który będzie pokazywał ilośd osób aktualnie przeglądający stronę oraz ilośd wszystkich osób, które odwiedziły stronę. Zadanie 1. Dodaj do aplikacji plik Global Application Class 2. Dodaj obsługę licznika w pliku Global Application Class 3. Utwórz nową kontrolkę użytkownika zawierqającą licznik Tok postępowania Otwórz projekt przygotowany na poprzednich zajęciach. Następnie wybierz Website -> Add New Item. W oknie Templates wybierz Global Application Class, w polu Name wpisz Global.asax, a w liście rozwijanej Language wybierz C#. W pliku Global.asax w metodzie Application_Start utwórz dwie zmienne aplikacji: usercount oraz activeusercount. Zainicjuj je wartością 0: Application["userCount"] = 0; Application["activeUserCount"] = 0; W metodzie Session_Start zwiększ o jeden wartości obu utworzonych zmiennych: int usercount = (int) Application["userCount"]; usercount++; Application["userCount"] = usercount; int activeusercount = (int) Application["activeUserCount"]; activeusercount++; Application["activeUserCount"] = activeusercount; W metodzie Session_End zmniejsz o jeden ilośd aktywnych użytkowników: int activeusercount = (int) Application["activeUserCount"]; activeusercount--; Application["activeUserCount"] = activeusercount; Utwórz nową kontrolkę użytkownika i nazwij ją Licznik.ascx. W widoku Source dodaj następujący fragment: Naszą stronę odwiedziło: <asp:label ID="licznikLabel" runat="server" /><br /> Aktualnie przebywa na stronie: <asp:label ID="licznikActiveLabel" runat="server" /> Do metodzie Page_Load kontrolki dodaj kod programu odpowiedzialny za pobranie i wyświetlenie w odpowiednich kontrolkach Label wartości zmiennych aplikacji: if (!IsPostBack) liczniklabel.text = Application["userCount"].ToString(); licznikactivelabel.text = Application["activeUserCount"].ToString(); Umieśd kontrolkę na stronie wzorcowej. Sprawdź poprawnośd wskazywania ilości użytkowników. Aby zwiększyd ilośd użytkowników należy otworzyd dowolną stronę aplikacji w innej przeglądarce. Strona 11-6

Problem 2 (czas realizacji 15 min) Nadszedł czas na największe wyzwanie. Twoim zdaniem jest obsługa koszyka zakupów dla klientów strony. Musisz najpierw przygotowad stronę, która będzie wyświetlała zawartośd koszyka. Twój klient musi mied możliwośd zmiany ilośd poszczególnych produktów, jak i usuwania. Wraz z zespołem zastanawiałeś się, jak zrealizowad dodawanie produktów do koszyka i doszliście do wniosku, że najlepiej i najprościej będzie dodawad je przez parametr ProdID wywołania strony. Nie zapomnij o uzupełnieniu stron wyświetlających produkty o możliwośd dodawania ich do koszyka. Wyświetl w menu możliwośd przeglądania koszyka, jak i usuwania całej jego zawartości. Zadanie 1. Dodaj plik i kontrolkę wyświetlającą zawartośd koszyka 2. Dodaj do kontrolki GridView przyciski do edycji i usuwania Tok postępowania Do projektu dodaj plik Zakupy.aspx oparty na szablonie SzablonStrony.master. Umieśd na stronie kontrolkę GridView. W oknie Properties: w polu ID wpisz KoszykGridView w polu EmptyDataText wpisz Twój koszyk jest pusty w polu EnableViewState z listy rozwijanej wybierz False Kliknij Smart Tag kontrolki KoszykGridView i wybierz Edit Colmuns. W obszarze Aviailable Fields wybierz BoundField i kliknij Add. W obszarze BoundField Properities: w polu HeaderText wpisz Nazwa produktu w polu DataField wpisz Nazwa w polu ReadOnly z listy rozwijanej wybierz True W obszarze Aviailable Fields wybierz BoundField i kliknij Add. W obszarze BoundField Properities: w polu HeaderText wpisz Cena w polu DataField wpisz Cena w polu DataFormatString wpisz 0:c w polu HtmlEncode z listy rozwijanej wybierz False w polu ReadOnly z listy rozwijanej wybierz True W obszarze Aviailable Fields wybierz BoundField i kliknij Add. W obszarze BoundField Properities: w polu HeaderText wpisz Ilośd sztuk w polu DataFormatString wpisz 0:d w polu DataField wpisz IloscSztuk W obszarze Aviailable Fields wybierz BoundField i kliknij Add. W obszarze BoundField Properities: w polu DataField wpisz Suma w polu DataFormatString wpisz 0:c w polu HeaderText wpisz Wartośd w polu HtmlEncode z listy rozwijanej wybierz False w polu ReadOnly z listy rozwijanej wybierz True W obszarze Aviailable Fields wybierz CommandField i kliknij Add. W obszarze CommandField Properities: w polu ButtonType z listy rozwijanej wybierz Button w polu ShowDeleteButton z listy rozwijanej wybierz True w polu ShowEditButton z listy rozwijanej wybierz True Strona 11-7

rekordów w polu CancelText wpisz Anuluj w polu DeleteText wpisz Usuo towar w polu EditText wpisz Zmieo ilośd w polu UpdateText wpisz Aktualizuj Dodaj kontrolkę Button i w oknie Properties: w polu ID wpisz kasabutton w polu PostBackUrl wpisz ~/Zamowienie.aspx w polu Text wpisz Do kasy Zapisz zmiany. 3. Rozszerz aplikacje możliwośd dodawania produktów do koszyka Otwórz stronę Produkty.aspx. W widoku Design kliknij Smart Tag kontrolki ProduktyGridView i wybierz Edit Columns. Z list Available fields wybierz HyperLinkField i wciśnij Add. W oknie HyperLinkField properities: w polu DataNavigateUrlFields wpisz ProductID w polu DataNavigateUrlFormatString wpisz ~/Zakupy.aspx?id=0 w polu HeaderText wpisz Dodaj do koszyka Otwórz stronę Szczegoly.aspx. W widoku Source przed znacznikiem </asp:view> kontrolki View o ID="prawidlowyView" dodaj: <asp:hyperlink ID="KoszykHyperLink" runat="server" Text="Dodaj do koszyka" /> <br /> Otwórz plik Szczegoly.aspx.cs i wewnątrz bloku if (produkt!=null) dodaj: KoszykHyperLink.NavigateUrl = "~/Zakupy.aspx?ProdID=" + produkt.productid; Otwórz plik Web.sitemap. Do głównego elementu za elementem wyświetlającym menu produktów dodaj: <sitemapnode title="koszyk" description="zarządzaj koszykiem" roles="*"> <sitemapnode url="zakupy.aspx" title="przeglądaj" description="przejrzyj zawartość koszyka" /> <sitemapnode url="oproznijkoszyk.aspx" title="opróżnij koszyk" description="opróżnij zawartość koszyka" /> </sitemapnode> Strona 11-8

Problem 3 (czas realizacji 25 min) Wspólnie z zespołem jesteś zadowolony z wyglądu aplikacji. Teraz należy przygotowad logikę obsługującą koszyk. Wspólnie przygotowaliście dwie klasy (Rys. 2), które będą odpowiedzialne za obsługę koszyka. Dodatkowo musisz napisad logikę odpowiedzialną za zarządzanie koszykiem na stronie Zakupy.aspx. Musisz odpowiednio umożliwid dodawanie, edycja i usuwanie produktów z koszyka Rys. 2 Diagram klas elementów koszyka Zadanie 1. Dodaj klasę ElementKoszyka Tok postępowania Kliknij prawym przyciskiem myszy folder App_code i wybierz Add New Item. Następnie z okna Template wybierz Class, w polu Name wpisz ElementKoszyka.cs, a w liście rozwijanej Language wybierz Visual C#. W pliku utwórz cztery właściwości Nazwa, ProdID, Cena i IloscSztuk: public string Nazwa get; set; public int ProdID get; set; public decimal Cena get; set; public int IloscSztuk get; set; Do konstruktora domyślnego klasy ElementyKoszyka dodaj następujący kod: ProdID = 0; Nazwa = ""; Cena = 0; IloscSztuk = 0; Dodaj konstruktor parametryzowany klasy przyjmujący parametry: prodid, nazwa, cena i iloscsztuk. public ElementKoszyka(int prodid, string nazwa, decimal cena, int iloscsztuk) ProdID = prodid; Nazwa = nazwa; Cena = cena; IloscSztuk = iloscsztuk; Utwórz właściwośd Suma: public decimal Suma get return Cena * IloscSztuk; Zapisz zmiany w pliku. Strona 11-9

2. Dodaj klasę Koszyk Kliknij prawym przyciskiem myszy folder App_code i wybierz Add New Item. Następnie z okna Template wybierz Class, w polu Name wpisz Koszyk.cs, a w liście rozwijanej Language wybierz Visual C#. W sekcji using dodaj: using System.Collections.Generic; Do klasy Koszyk dodaj pole prywatne _koszyk zawierające listę obiektów klasy ElementKoszyka: private List<ElementKoszyka> _koszyk; Do konstruktora klasy Koszyk dodaj następujący kod: _koszyk = new List<ElementKoszyka>(); Do metody dodaj właściwośd Ilosc zwracającą ilośd elementów w koszyku: public int Ilosc get return _koszyk.count; Do klasy dodaj metodę Pobierz zwracającą listę elementów koszyka: public List<ElementKoszyka> Pobierz() return _koszyk; Do klasy dodaj metodę AktualizujIlosc przyjmującą dwa parametry typu int: indeks i iloscsztuk: public void AktualizujIlosc(int indeks, int iloscsztuk) ElementKoszyka element = _koszyk[indeks]; element.iloscsztuk = iloscsztuk; Do klasy dodaj metodę UsunElement przyjmującą jeden parametr indeks usuwanego element: public void UsunElement(int indeks) _koszyk.removeat(indeks); Do klasy dodaj metodę Dodaj przyjmującą parametr prodid identyfikator produktu, który należy dodad do koszyka. W metodzie dodaj odpowiedni produkt: public void Dodaj(int prodid) bool znaleziono = false; foreach (ElementKoszyka element in _koszyk) if (element.prodid == prodid) element.iloscsztuk += 1; znaleziono = true; if (!znaleziono) AdventureWorksDataContext db = new AdventureWorksDataContext(); var produkt = (from p in db.products where p.productid == prodid select p).firstordefault(); if (produkt!= null) ElementKoszyka element = new ElementKoszyka(prodID, produkt.name, produkt.listprice, 1); _koszyk.add(element); Strona 11-10

3. Dodaj obsługę koszyka w pliku Zakupy.aspx.cs Otwórz plik Zakupy.aspx.cs. Do klasy Zakupy dodaj obiekt koszyka typu Koszyk: Koszyk koszyk; W metodzie Page_Load utwórz nowy lub pobierz (jeśli istnieje) obiekt koszyka przechowywany w stanie sesji: koszyk = (Koszyk)Session["koszyk"]; if (koszyk == null) koszyk = new Koszyk(); Session["koszyk"] = koszyk; Następnie w tej samej metodzie dodaj do koszyka produkt, którego ProdID został przekazany przez parametr wywołania strony. Wyświetl koszyk w kontrolce GridView1: if (!IsPostBack) string req = Request.QueryString["prodID"]; if (req!= null) int prodid = int.parse(request.querystring["prodid"]); koszyk.dodaj(prodid); //usuwanie z adresu prodid string url = Request.Url.AbsolutePath; System.Web.HttpContext.Current.RewritePath(url, "", ""); KoszykGridView.DataSource = koszyk.pobierz(); KoszykGridView.DataBind(); kasabutton.enabled = (koszyk.ilosc > 0); W widoku Design wybierz kontrolkę KoszykGridView. W oknie Properties kliknij Events, a następnie dwukrotnie kliknij RowDeleting. W metodzie obsługi zdarzenia dodaj: koszyk.usunelement(e.rowindex); KoszykGridView.DataBind(); W widoku Design wybierz kontrolkę KoszykGridView. W oknie Properties kliknij Events, a następnie dwukrotnie kliknij RowEditing. W metodzie obsługi zdarzenia dodaj: KoszykGridView.EditIndex = e.neweditindex; KoszykGridView.DataBind(); W widoku Design wybierz kontrolkę KoszykGridView. W oknie Properties kliknij Events, a następnie dwukrotnie kliknij RowUpdating. W metodzie obsługi zdarzenia dodaj: TextBox tb = (TextBox) KoszykGridView.Rows[e.RowIndex].Controls[2].Controls[0]; try int wartosc = int.parse(tb.text); if (wartosc<0) wartosc =wartosc*(-1); koszyk.aktualizujilosc(e.rowindex, wartosc); catch e.cancel = true; KoszykGridView.EditIndex = -1; KoszykGridView.DataBind(); W widoku Design wybierz kontrolkę KoszykGridView. W oknie Properties kliknij Events, a następnie dwukrotnie kliknij RowCancelingEdit. W metodzie obsługi zdarzenia dodaj: Strona 11-11

4. Dodaj stronę do usuwania koszyka 5. Przetestuj dodawanie produktów do koszyka e.cancel = true; KoszykGridView.EditIndex = -1; KoszykGridView.DataBind(); Zapisz zamiany. Sprawdź możliwośd dodawania, edycji i usuwania produktów z koszyka. Dodaj plik OproznijKoszyk.aspx oparty na szablonie SzablonStrony.master. Do pliku OproznijKoszyk.aspx.cs dodaj: Session["koszyk"] = null; Response.Redirect("~/Default.aspx"); Dodaj produkty do koszyka. Zmieo ilośd produktów wpisując wartośd ujemną oraz wpisując tekst zamiast liczby. Strona 11-12