background image

ITA-103 Aplikacje Internetowe 

Piotr Bubacz 

Moduł 11 

Wersja 1 

Zarządzanie stanem w aplikacjach 

ASP.NET 

Spis treści 

Zarządzanie stanem w aplikacjach ASP.NET ........................................................................................ 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 

 

 

background image

Piotr Bubacz 

 

Moduł 11 

ITA-103 Aplikacje Internetowe 

 

Zarządzanie stanem w aplikacjach ASP.NET 

Strona 11-2 

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Ł 11

MODUŁ 14

MODUŁ 3

MODUŁ 6

MODUŁ 1

MODUŁ 5

MODUŁ 2

MODUŁ 4

MODUŁ 8

MODUŁ 9

MODUŁ 10

MODUŁ 12

MODUŁ 13

 

Rys. 1 Mapa zależności modułu 

 

background image

Piotr Bubacz 

 

Moduł 11 

ITA-103 Aplikacje Internetowe 

 

Zarządzanie stanem w aplikacjach ASP.NET 

Strona 11-3 

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 

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: 

background image

Piotr Bubacz 

 

Moduł 11 

ITA-103 Aplikacje Internetowe 

 

Zarządzanie stanem w aplikacjach ASP.NET 

Strona 11-4 

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: 

string info = (string) Application["info"]; 
DateTime AppStartTime = (DateTime) Application["AppStartTime"]; 

Stan sesji 
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/en-

us/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 Statehttp://msdn.microsoft.com/en-us/library/bf9xhdz4.aspx 

Na stronie przedstawiono szczegółowe informacje dotyczące zarządzania stanem w 
aplikacjach ASP.NET. 

background image

Piotr Bubacz 

 

Moduł 11 

ITA-103 Aplikacje Internetowe 

 

Zarządzanie stanem w aplikacjach ASP.NET 

Strona 11-5 

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. 

 

 

background image

Piotr Bubacz 

 

Moduł 11 

ITA-103 Aplikacje Internetowe 

 

Zarządzanie stanem w aplikacjach ASP.NET 

Strona 11-6 

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 

Tok postępowania 

1.  Dodaj do 
aplikacji plik 
Global Application 
Class 

 

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#

2.  Dodaj obsługę 
licznika w pliku 
Global Application 
Class 

 

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; 

3.  Utwórz nową 
kontrolkę 
użytkownika 
zawierqającą 
licznik 

 

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. 

background image

Piotr Bubacz 

 

Moduł 11 

ITA-103 Aplikacje Internetowe 

 

Zarządzanie stanem w aplikacjach ASP.NET 

Strona 11-7 

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 

Tok postępowania 

1.  Dodaj plik i 
kontrolkę 
wyświetlającą 
zawartośd koszyka 

 

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 

2.  Dodaj do 
kontrolki 
GridView przyciski 
do edycji i 
usuwania 

 

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 

background image

Piotr Bubacz 

 

Moduł 11 

ITA-103 Aplikacje Internetowe 

 

Zarządzanie stanem w aplikacjach ASP.NET 

Strona 11-8 

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> 

 

 

 

background image

Piotr Bubacz 

 

Moduł 11 

ITA-103 Aplikacje Internetowe 

 

Zarządzanie stanem w aplikacjach ASP.NET 

Strona 11-9 

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 

Tok postępowania 

1.  Dodaj klasę 
ElementKoszyka 

 

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 NazwaProdIDCena 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: 
prodIDnazwacena 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.  

background image

Piotr Bubacz 

 

Moduł 11 

ITA-103 Aplikacje Internetowe 

 

Zarządzanie stanem w aplikacjach ASP.NET 

Strona 11-10 

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 
intindeks 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); 
    } 
  } 

 

background image

Piotr Bubacz 

 

Moduł 11 

ITA-103 Aplikacje Internetowe 

 

Zarządzanie stanem w aplikacjach ASP.NET 

Strona 11-11 

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

następnie 

dwukrotnie 

kliknij 

RowCancelingEdit. W metodzie obsługi zdarzenia dodaj: 

background image

Piotr Bubacz 

 

Moduł 11 

ITA-103 Aplikacje Internetowe 

 

Zarządzanie stanem w aplikacjach ASP.NET 

Strona 11-12 

e.Cancel = true; 
KoszykGridView.EditIndex = -1; 
KoszykGridView.DataBind(); 

 

Zapisz  zamiany.  Sprawdź  możliwośd  dodawania,  edycji  i  usuwania 
produktów z koszyka. 

4.  Dodaj stronę 
do usuwania 
koszyka 

 

Dodaj 

plik 

OproznijKoszyk.aspx 

oparty 

na 

szablonie 

SzablonStrony.master

 

Do pliku OproznijKoszyk.aspx.cs dodaj: 

Session["koszyk"] = null; 
Response.Redirect("~/Default.aspx"); 

5.  Przetestuj 
dodawanie 
produktów do 
koszyka 

 

Dodaj  produkty  do  koszyka.  Zmieo  ilośd  produktów  wpisując  wartośd 
ujemną oraz wpisując tekst zamiast liczby.