ITA-103 Aplikacje Internetowe
Piotr Bubacz
Moduł 11
Wersja 1
Zarządzanie stanem w aplikacjach
ASP.NET
Spis treści
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
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
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:
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 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.
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.
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.
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
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>
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 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.
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
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);
}
}
}
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,
a
następnie
dwukrotnie
kliknij
RowCancelingEdit. W metodzie obsługi zdarzenia dodaj:
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.