Documente Academic
Documente Profesional
Documente Cultură
LUCRARE DE LICEN
Evidena evenimentelor n ASP .NET i C#
COORDONATOR TIINIFIC
Lect. Dr. Mihail Cherciu
ABSOLVENT
(prenume nume)
BUCURETI
2013
1. NOIUNI INTRODUCTIVE..................................................................................................3
12
27
2.3.1 Repeater................................................................................................................27
2.3.2 DataList................................................................................................................27
2.3.3 DataGrid...............................................................................................................28
1
2.3.4 GridView..............................................................................................................28
2.4 Clasele WebControl
31
33
36
40
42
49
50
51
NOIUNI INTRODUCTIVE
World Wide Web funcioneaz pe baza principiului de lucru n reeaua client/server.
Atunci cand se scrie n browser o adres URL i se apasa Enter, de fapt se face o cerere HTTP
ctre un calculator ce are adresa respectiv. Astfel, calculatorul respectiv randeaz pagina cerut.
n cazul internetului, aceste calculatoare se pot gsi n orice loc din lume.
Un server web este un program ce decodific cererile HTTP i randeaz pagina web
cutat ntr-o form compatibil cu browser-ul. Acest termen este utilizat att pentru calculatorul
pe care ruleaz pagina respectiv, ct i pentru definirea definirea unui program de server web.
Sunt multi-platform ;
Nu au nevoie de upgrade deoarece toate funcionalitile noi ale aplicaiei sunt
Dezavantaje:
Dezvoltarea pe partea de front-end (pe partea de client) const n crearea de pagini statice
(pagini care arat la fel indiferent de informaia din baza de date). Acestea se creeaz n HTML,
CSS, Javascript i eventual, jQuery (o librrie a Javascript-ului).
O problem a dezvoltrii pe partea de client o constituie incompatibilitatea cu unele
browsere sau sisteme de operare.
HTML (HyperText Markup Language) reprezint un limbaj de marcare, cu ajutorul cruia
putem structura pagina noastr astfel nct browserul s tie cum afieze informaiile. Cu ajutorul
CSS (Cascading Style Sheets) - ului vom putea personaliza anumite elemente HTML din pagin.
JavaScript este un limbaj de scriptare ce ofer posibilitatea de a crea pagini web
interactive (cu diverse animaii), de a controla anumite caracteristici ale browserului, deschiderea
de noi ferestre si pop-up-uri etc. Codul scris in JavaScript se poate ngloba n pagina HTML, ntre
tagurile <script> i </script>. Pentru ca mai multe pagini web s dispun de o funcie JavaScript
din alt pagin (fr a fi rescris), funcia respectiv poate fi memorat ntr-un fiier separat de pe
server, iar pe fiecare pagin ce folosete funcia respectiv vom avea <script
language=text/javaScript src=functie.js> </script>.
jQuery este o librrie a JavaScript-ului folosit pentru animaii i efecte. Integrnd i
jQuery n aplicaia noastr, vom avea un design mai atractiv.
XML (Extensible Markup Language) este un limbaj de marcare ce asigur trasmiterea i
memorarea datelor ntr-un mod structurat. Se aseaman foarte bine cu HTML-ul (este mai
puternic i mai flexibil), doar c etichetele pot fi definite in funcie de dorinele utilizatorului
(numele etichetelor vor descrie datele ce le conin).
Standardele web ce urmeaz sunt considerate fundamentale:
Pentru Document Object Model (DOM se ine seama de recomandrile fcute de W3C.
Serviciile web au mai multe roluri, precum: folosirea unui registru UDDI, unui ablou
WSDL, unei interfae SOAP ce permite interaciunea ntre aplicaii i a unei reele(Internet)
pentru transportul datelor.
Soap este un protocol de mesagerie bazat pe XML. De fapt, o cerere Soap conine mai
multe elemente ce curpind informaii despre apelare i rspunsuri neateptate, dar i elemente ce
transport diverse date. Un mesaj Soap poate fi transmis cu ajutorul metodelor HTTP Get sau
Post.
Fiind bazat pe mesaje, SOAP poate fi uor implementat peste protocoale de reea
asincrone, precum SMTP.
Avantaje:
Dezavantaje:
SOAP - ul limiteaz cantitatea de date trimise i din cauza formatului XML, poate fi
destul de lent (cnd se trimit mesaje scurte nu mai avem aceast problem).
n anumite cazuri, dezvolttorii trebuie s utilizeze polling n schimbul unei notificri.
foarte convenabil deoarece timpul de ncrcare a paginilor s-ar reduce semnificativ, ns se pot
crea dificulti atunci cnd scriem o aplicaie n Ajax, deoarece acesta comunic foarte mult cu
serverul i nu are nevoie de rencrcarea din memoria cache.
205 (Resetare
coninut)
206 (Coninut
parial)
readyState: are doar drept de citire i reprezint un intreg care indica starea obiectului
Metode:
Abort(): oprete cererea curent. Cnd este invocat, metoda trebuie s anuleze orice
activitate de transmitere de date pentru care este responsabil obiectul i sa il reseteze. Metoda
nu primete parametrii, nu ntoarce nicio valoare si nu genereaz excepii.
diferit de 3 sau 4.
Open(method, URL,a): furnizeaz metoda HTTP (dac se folosete GET, atunci adresa
url trebuie s fie denumit corespunztor), adresa url cerut i dac cererea a fost gestionat
asincron(dac da, a-ul va fi true, altfel va fi false).
Send(content): trimite cererea la server. Dac proprietatea readyState are o valoare diferit de
1(Open), va fi generat o excepie INVALID_STATE_ERR. Altfel, proprietatea respectiv
1.3.1 ScriptManager
<asp:ScriptManager ID="ScriptManager1"
runat="server"></asp:ScriptManager>
La nivel de design, ScriptManager -ul reprezint un element gol deoarece acesta nu
genereaz nici un tag HTML. n schimb, acesta are un rol important i anume de a aduga linkuri
ctre librriile de JavaScript ASP.NET AJAX.
Fiecare pagin ce utilizeaz funcionaliti ASP.NET AJAX cere o instan a
ScriptManager - ului. Se poate utiliza doar un singur ScriptManager pe o pagin. Controalele
activate ASP.NET AJAX pot interaciona cu ScriptManager - ul, cerndu-i afiarea linkurilor
ctre resursele de JavaScript.
Dup acest control trebuie s folosim un alt control foarte important (UpdatePanel).
Acesta permite nglobarea elementelor ce vor fi parial updatate i poate cuprinde tagurile
ContentTemplate sau Triggers. ContentTemplate este obligatoriu cci nglobeaz coninutul
panoului, care poate reprezenta orice element din pagin, de la casete text pan la controale web.
Tagul Triggers ne permite de a defini triggeri ce vor manipula coninutul panoului. n afar de
aceste controale, restul sunt controale standard. Proprietatea view state indic statusul paginii
atunci cnd s-a fcut o cerere HTTP.
9
Proprieti:
AsyncPostBackErrorMessage - seteaz sau extrage mesajul de eroare ce este trimis
userului atunci cnd o excepie este declanat n timpul post-back-ului asincron.
IsInAsyncPostBack - extrage valoarea ce indic dac postback-ul curent este executat n
timpul unei randri pariale.
Context - extrage obiectul HTTPContext asociat cu controlul serverului pentru cererea
curent.
EnablePartialRendering - seteaz sau extrage o valoare care permite randarea parial a
paginii, care n schimb permite updatarea anumitor elemente din pagin, ce sunt incluse n
controalele din UpdatePanel.
10
11
nceputul stringului.
PadLeft() i PadRight() - adaug la string caracterul specificat de attea ori ct este
substring.
IndexOf() i LastIndexOf() - gsete prima poziie a unui substring dintr-un string.
Acestea returneaz doar prima potrivire i pot cuta ncepnd de la nceput sau sfritul
stringului. De asemenea, se pot folosi i versiuni suprascrise ale acestor metode ce accept
2.1.2 Interfee
O clas abstract este o clas ce nu poate fi instaniat. Aceasta se utilizeaz pentru
motenire. O clas abstract poate conine codul complet sau parial, care poate fi rescris.
O clas ce nu este abstract i deriveaz dintr-o clas abstract trebuie s conin
implementrile membrilor abstraci.
Interfaa este o clas abstract ce conine numai signaturile funciilor. Poate conine
metode, evenimente, indeci (nu conine cmpuri, constructori, destructori, operatori, membri de
tip static sau tipuri imbricate). Membrii interfeei sunt implicit public abstract(virtuali). Clasele i
struct -urile pot implementa mai multe interfee, iar interfeele pot extinde alte interfee.
13
O clas poate moteni o singur clas de baz, dar poate implementa mai multe interfee.
Fiecare membru al interfeei trebuie implementat sau motenit de la o clas de baz.
Implementarea metodelor nu trebuie declarat ca override, ci folosind virtual sau abstract(o
interfa poate fi implementat de o clas abstract).
Din punct de vedere al vitezei de execuie, o interfa este mai lent dect o clas
abstract.
2.1.3 Delegai
Un delegat este un tip ce refereniaz o metod. Odat ce delegatul este ataat metodei
respective, acesta se va comporta exact ca metoda corespunztoare. Variabila poate fi folosit
oricnd pentru a invoca metoda respectiv.
Signatura unui delegat conine cuvntul cheie de accesibilitate, tipul de date returnat,
parametrii i tipul acestora.
Un delegat se poate declara ca o metod i se utilizeaz exact ca o metod obinuit, cu
parametri i valoare returnat. Orice metod ce cuprinde acelai tip returnat i aceeai parametri
ca a unui delegat poate fi asignat acestuia. De exemplu, dac avem o metod ce accept ca
parametru un string i o alta care accept doi parametri, tot de tip string, vom avea nevoie de doi
delegai pentru fiecare metod n parte. Numele delegatului i a parametrilor nu conteaz,
important este ca tipul de date returnat i cel al parametrilor s coincid cu cel al delegatului
pentru a putea referenia respectiva metod. Delegaii sunt asemntori pointerilor la funcii din
C#, doar c au anumite restricii.
Declararea unui tip delegat:
delegate void Del (string sender);
Declararea unei variabile de tip delegat:
Del delegat;
Asignarea unei metode la o variabil de tip delegat:
void MyName(string name)
{
Console.WriteLine("My name is " + name);
}
delegat = new Del(MyName);
Apelarea unui delegat:
delegat(del);
14
15
16
Membrii statici ai unei clase sunt adesea folosii pentru a furniza anumite funcionaliti
ale unui obiect. Pentru a crea o proprietate sau o metod static trebuie folosit cuvntul cheie
static imediat dup cuvntul ce definete accesibilitatea cmpului respectiv. Proprietatea
respectiv va avea aceai valoare n toate obiectele definite, deci o putem accesa prin numele su,
fr a instania vreun obiect. Pentru a accesa cmpuri non-statice din clas avem nevoie de
instanierea unui obiect.
De exemplu, dac vrem ca la fiecare PostBack s se afieze numrul de PostBack-uri
realizate pn n acel moment, definim n clasa noastr o variabil static global:
public static int nr;
Pe partea de client avem un Label cu id-ul Label1 n care vom afia numrul de PostBackuri realizate pn n acel moment. Deci, n funcia de Page_Load avem:
protected void Page_Load(object sender, EventArgs e)
{
nr++;
Label1.Text = nr.ToString();
}
Deci, de fiecare dat cnd se va face un PostBack, valoarea din Label1 se va incrementa.
Exist clase care conin numai elemente de tipul static. Atunci, putem defini i clase cu
ajutorul cuvntului cheie static, iar elementele sale componente vor avea i ele cuvntul
static la declarare. Aceste clase nu vor putea fi instaniate.
17
.NET nume
Conine
byte
Byte
Un ntreg de la 0 la 255.
short
Int16
int
Int32
long
Int64
float
Single
double
Double
char
Char
String
String
Bool
Boolean
DateTime
object
Object
Pentru a introduce cod C# n ASP .NET, l vom introduce ntre <%# i %>. De exemplu:
public partial class SetURL : System.Web.UI.Page
{
protected string URL;
protected void Page_Load(Object sender, EventArgs e)
{
URL = "imagini/poza.png";
this.DataBind();
}
}
Astfel, vom avea o variabil URL ce poate fi accesat i folosit de elemente de pe partea de
client. URL poate fi un url-ul unui link, al unei imagini sau text al unei etichete:
<asp:Image id="ThisIsmyImage" ImageUrl="<%# URL %>"
runat="server" />
<asp:Hyperlink id="ThisIsMyHiperLink" Text="Path to an image"
NavigateUrl="<%# URL %>"
runat="server" />
<asp:Label id="MyLabel" runat="server"><%# URL %></asp:Label>
19
n ASP .NET, o pagin este format din trei seciuni. Prima seciune este constituit de
directiv:
<%@ Page Language="C#" AutoEventWireup="true"
CodeFile="Default.aspx.cs" Inherits="_Default" %>
Aceasta ofer informaii despre compilarea paginii, despre limbajul folosit i modul de
tratare a event-urilor. Poate indica de asemenea unde este localizat fiierul i numele obinuit al
paginii. Directiva paginii nu trebuie neaparat modificat de utilizator, deoarece Visual Studio face
asta automat.
A doua seciune este constituit de doctype. ntr-o pagin normal Asp .NET, doctype-ul se
afl pe prima rnd al paginii, dar ntr-un web form acesta ocup al doilea rnd, dup directiv.
Acesta este opional, dar Visual Studio l adaug automat. Doctype-ul reflect tipul de markup (de
exemplu HTML sau XHTML) ce se utilizeaz n pagin. Este destul de important deoarece
influeneaz modul de interpretare a browser-ului asupra paginii. Astfel, pot aprea probleme n
anumite browsere (n special n Internet Explorer).
Dup procesarea codului pe server, motorul Asp .NET creeaz un snapshot HTML ce l
trimite browserului.
A treia seciune este marcat de deschiderea tagului <HTML>. n interiorul acestui tag,
pagina noastr este mprit n 2 seciuni:
head (ce stocheaz informaii despre pagin - de exemplu titlul, cuvinte cheie etc ) - avem
20
fiiere. Controalele userului permit dezvoltarea unei mici pri ale interfeei userului i integrarea
acesteia n mai multe formulare fr a rescrie codul.
ASP .NET, ci conine handleri de evenimente ce trateaz evenimente ale aplicaiei. Cnd
adugm acest fiier, Visual Studio insereaz mai multe handlere implicite, iar noi trebuie s le
adugm cod. Evenimentele ce pot aprea sunt:
Application_Start() apare atunci cnd pornete aplicaia, cnd este prima oar cns se primete
o cerere de la un utilizator. Nu se va declana dup mai multe cereri.Acest eveniment este creat
pentru a memora unele informaii iniiale ce pot fi folositoare pe viitor.
Application_End() apare atunci cnd aplicaia este prsit din cauza faptului c serverul este
restartat. n tratarea acestui eveniment se poate introduce cod pentru curare.
Application_BeginRequest() apare la fiecare cerere primit de aplicaie, exact nainte de
executarea codului.
Application_EndRequest() apare la fiecare cerere primit de aplicaie, exact dup executarea
codului.
Session_Start() apare dac a fost acceptat o cerere a unui utilizator nou i a nceput o nou
sesiune.
Session_End() apare dac o sesiune a expirat sau s-a terminat dintr-un alt motiv
Application_Error() apare n urma unei erori ce nu a fost luat n considerare.
n fiierul web.config avem trei seciuni principale cu care vom lucra: seciunea
<appSettings> ce permite de a aduga diverse informaii, seciunea <connectionStrings> ce
permite definirea informaiilor necesare pentru accesarea unei bazde de date i seciunea
<system.web> ce cuprinde fiecare setare ce trebuie configurat. n interiorul acestei seciuni,
fiecare element ce constituie un aspect al configurrii este un tag separat. De exemplu, putem
aduga tagul < authentication> pentru a configura setrile referitoare la autentificare. Cnd creem
un website, n seciunea <system.web> avem un singur element i anume <compilation>. Acesta
specific dou proprieti utiliznd dou atribute:
21
debug acest atribut spune ASP-ului dac s compileze aplicaia n modul de debug,
pentru a putea utiliza instrumentele oferite de Visual Studio pentru a face debug(atunci
cnd rulm aplicaia, Visual Studio ne ntreab dac vrem s comutm pe modul de debug
Transfer() nu se poate folosi pentru a transfera userul ctre un alt website sau ctre o pagin care
nu este ASP .NET (de exemplu pagin HTML). Aceast metod permite redirecionarea de la o
pagin ASP .NET la alta, din aceeai aplicaie.
n concluzie, este mult mai indicat de a folosi HTTPResponse.Redirect() dect
HTTPServerUtility.Transfer().
24
n pagina HTML se pot scrie diverse script-uri ce conin funcii. Acestea se scriu ntre
tagurile <script> i </script>. Accesarea funciilor din script-uri pot fi accesate la comand sau ca
i rspuns la un eveniment. Pentru a se apela aceste funcii localizate n script-uri se folosete
metoda InvokeScript. Dac funcia apelat returneaz un element HTML, acesta trebuie convertit
la HTMLElement.
De exemplu, n script avem:
<SCRIPT>
function thisIsMe(name,age)
{
alert("Name is " + name + "and age is " + age);
}
</SCRIPT>
n code-behind avem:
private void Test(String name, String age)
{
if (webBrowser1.Document != null)
{
Object[] objectsArray = new Object[2];
objectsArray[0] = (Object)name;
objectsArray[1] = (Object)age;
webBrowser1.Document.InvokeScript("thisIsMe",
objArray);
}
}
n pagina noastr avem un control WebBrowser cu numele WebBrowser1.
Pentru a regsi un anumite atribut, se folosete funcia:
public string GetAttribute
(
string attributeName
)
AttributeName reprezint numele atributului i este de tip String. Dac atributul respectiv
nu exist pentru elementul respectiv, se returneaz stringul vid.
Funciile GetAttribute i SetAttribute sunt case-insensitive.
Exemplu de extragere a meta-informaiilor:
private void ShowMeta()
{
if (webBrowser1.Document != null)
{
HTMLElementCollection metaElems =
webBrowser1.Document. GetElementsByTagName("META");
25
HeaderTemplate: este folosit pentru elementele ce trebuie afiate o singur dat naintea
seciunii ItemTemplate.
26
FooterTemplate: este folosit pentru elementele ce trebuie afiate o singur dat dup
seciunea ItemTemplate.
ItemTemplate: este folosit pentru elementele ce trebuie afiate o singur dat pe un rnd.
AlternatingItemTemplate: este folosit pentru elementele ce trebuie afiate pe fiecare rnd
cu indice par (aceasta ne permite de a alterna culoarea de fundal). Este folosit doar pentru
2.3.2 DataList
Ca i Repeater-ul, DataList-ul este folosit pentru a afia o list de elemente care se repet.
DataList-ul furnizeaz grupri de date i un model flexibil (ca i ListView), dar nu ofer i
funcionaliti precum updatarea, tergerea, paginarea sau sortarea.
Proprietile precum RepeatDirection = "Horizontal" / "Vertical" ne ajut la afisarea
elementelor pe direcie orizontal / vertical, iar RepeatColumns = "5" ne arat numrul de
coloane.
2.3.3 DataGrid
DataGrid - ul este un control cu mai multe coloane. Aceste coloane pot fi folosite pentru a
afia sau edita datele. Putem include i comenzi de Edit, Update, Cancel, Select Buttons, Custom
Buttons i Template Columns. Acest control afieaz cmpurile unui DataSource ca i coloanele
unui tabel n care fiecare rnd reprezint o nregistrare din baza de date. DataGrid-ul permite
selectarea, editarea, paginarea i sortarea elementelor sale. Ca i Repeater-ul i DataList-ul, acesta
permite formatarea i editarea diverselor nregistrri dintr-un tabel. n plus, are funcionaliti
avansate, precum sortarea i paginarea nregistrrilor. Acestea pot fi afiate n DataGrid fr a
utiliza abloane. Un DataSource poate fi cu uurin legat de DataGrid i astfel, acesta va afia
automat nregistrrile din tabelul ce provine din baza de date definit n DataSource.
2.3.4 GridView
Controlul GridView este sucesorul DataGrid -ului. Acesta se folosete prin asocierea cu
un DataSource prin proprietatea DataSourceID. n ASP.NET 2.0 sunt mai multe controale
DataSource ce au fost creionate pentru a lucra cu diferite DataSource-uri. GridView -ul este
27
foarte flexibil, cuprinznd mai multe coloane pentru fiecare cmp din baza de date. Acest control
reprezint unul din cele mai puternice controale, cuprinznd multe funcionaliti ce uureaz
mult munca programatorului.
Acest control suport urmtoarele tipuri de cmpuri:
setat true).
ItemTemplate reprezint coninutul fiecrui rnd din tabel.
AlternatingItemTemplate reprezint coninutul fiecrui rnd impar din tabel(se poate si
seta un fundal diferit pentru aceste rnduri i atunci vom avea un deisgn mai atractiv).
EditItemTemplate cuprinde controale utilizate n modul de editare.
Pentru definirea coloanelor din GridView se folosete asp:BoundField, cu atributele
DataField i HeaderText. DataField va reprezenta numele cmpului din baza de date al crui
valoare va fi afiat pe rndul corespunztor. HeaderText reprezint numele coloanei ce va aprea
utilizatorului.
Pentru a nfrumusea GridView-ului putem folosi diverse proprieti:
HeaderStyle - presonalizeaz rndul ce cuprinde titlul coloanelor (dac este setat s apar
este selectat.
EditRowStyle - ofer posibilitatea de a personaliza un anumit rnd atunci cnd acesta este
editat.
FooterStyle dac ShowFooter este setat ca fiind true, se pot schimba diverse proprieti
ale footer-ului.
28
30
Proprieti:
respectiv.
Controls - curpinde toate controalele ce sunt coninute n controlul current. Fiecare obiect
este vzut ca i obiect generic din System.Web.UI.Control, aa c, pentru a accesa
faptul ca userul nu poate interaciona cu el, iar evenimentele sale nu vor fi declanate.
EnableViewState - dezactiveaz starea automat a controlului cnd este setat false; n
acest caz controlul va avea proprietile i formatarea specificat n tagul su de fiecare
dat cand se face post back.
Folosind ARGB (alpha, red, green, blue) fiecare reprezentnd fiind un ntreg ntre 0 i
255. Alpha reprezint transparena culorii (pentru opacitate total se folosete 255).
Folosind nume de culori predefinite n ASP .NET se pot alege din 140 de nume de
culori.
Folosind nume de culori din HTML se specific valoarea ca i un string folosing clasa
ColorTranslator.
utilizatorului.
Size - reprezint dimensiunea font-ului ca i obiect de tip FontUnit. Poate reprezenta o
Exemplu:
control.Font.Name = "Verdana";
control.Font.Bold = true;
Setarea dimensiunii folosind tipul FontUnit - dimensiune relativ:
control.Font.Size = FontUnit.Small;
Specific dimensiune absoluta de 14 px:
control.Font.Size = FontUnit.Point(14;
dintr-un select , pagina este retrimis (se face post back) i o nou versiune a paginii este
returnat.
Evenimente ale controalelor:
Eveniment
Se face PostBack
Click
Button, ImageButton
Adevrat
TextChanged
Fals
Fals
CheckedChanged
CheckBox, RadioButton
Fals
SelectedIndexChanged
Fals
RadioButtonList
Dac se dorete captarea imediat a unui eveniment(precum TextChanged,
CheckedChanged sau SelectedIndexChanged), trebuie setat proprietatea AutoPostBack la true.
Astfel, pagina va fi trimis atunci cnd utilizatorul va interaciona cu controlul. Atunci cnd
pagina va fi retrimis, ASP .NET va examina pagina i va ncrca informaiile curente. n funcie
de necesiti, unele controale vor face post back, iar altele nu.
35
36
sptmn ntreag). Calendarul este fcut astfel nct atunci cnd se selecteaz o anumit lun
s se poat aleag o singur zi din respectiva lun. Tipul de selecie se poate selecta prin
proprietatea Calendar.SelectionMode, iar configurarea pentru selectarea unei sptmni ntregi se
poate face folosin Calendar.FirstDayOfWeek. Atunci cnd se permite selectarea multipl a zilelor
este necesar verificarea proprietii SelectedDates ce cuprinde o colecie a datelor selectate.
Aceasta se poate itera folosind foreach. De exemplu:
selDates.Text = "Ai selectat urmatoarele date:<br />";
foreach(DateTime dt in MyCalendar.SelectedDates)
{
selDates.Text +=
dt.ToLongDateString()+ -;
2.7.1 Proprieti
DayHeaderStyle - afieaz stilul pentru seciunea calendarului ce cuprinde zilele saptmnii..
DayStyle - reprezint stilul default pentru zilele sptmnii din luna curent.
NextPrevStyle - reprezint tipul controalelor de navigare din seciunea de titlu ce duce la o lun
la alta.
OtherMonthDayStyle - reprezint stilul datelor ce nu sunt afiate n luna curent.
SelectedDayStyle - reprezint stilul datelor selectate.
SelectorStyle - reprezint stilul sptmnii / lunii selectate.
TitleStyle - reprezint stilul seciunii curente a titlului.
TodayDayStyle - reprezint stilul pentru datele ce reprezint data curent.
WeekendDayStyle - reprezint stilul pentru zilele din weekend.
n ASP .NET, cookie - urile sunt uor de folosit. Obiectele Request i Response (ce sunt
proprieti ale lui Page) furnizeaz colecii de cookie-uri. Cel mai important fapt este s nu uitm
c extragerea de cookie-uri se face cu ajutorul obiectului Request, iar setarea de cookie-uri se
face prin intermediul obiectului Response.
Pentru a seta un cookie trebuie creat un obiect de tip HTTPCookie, iar apoi trebuie setat
informaia corespunztoare i adugat rspunsului curent.
Crearea de cookie :
HTTPCookie cookie = new HTTPCookie("Pref");
Setarea unei valori:
cookie["Sign"] = "Pisces";
Adugarea altei valori:
cookie["City"] = "Bucharest";
Adugarea la rspuns:
Response.Cookies.Add(cookie);
Un astfel de cookie va fi trimis la fiecare cerere i va exista pn cnd userul nchide
browserul. Pentru a crea cookie-uri persistente se poate seta o dat de expirare a cookie-ului
respectiv. Un cookie ce expir dup cinci ani:
myCookie.Expires = DateTime.Now.AddYears(5);
Un cookie se poate accesa folosing colecia Request.Cookies:
HTTPCookie myCookie = Request.Cookies["Pref"];
Deoarece userul poate dezactiva cookie-urile , nainte de a accesa un cookie este recomandat s
testeze existena acestuia :
String Sign;
if(cookie != null)
{
Sign language = cookie["YourSign"];
}
Pentru a nltura un cookie, l putem nlocui cu un alt cookie cu o or de expirare din
trecut :
HTTPCookie myCookie = new HTTPCookie("Preferences");
myCookie.Expires = DateTime.Now.AddDays(-10);
Response.Cookies.Add(myCookie);
39
Metoda default este de a folosi cookie-uri (se utilizeaz un cookie special cu numele de
ASP.NET_SessionId, fiind creat automat de ASP .NET atunci cnd se folosete o colecie
de sesiune).
A doua metod este valabil i dac sunt dezactivate cookie-urile. Aceasta poate fi folosit
folosind URL - uri modificate. Dei aceast metod rezolv multe probleme de
administrare, serverul este forat s memoreze informaii adiionale ce pot influena
performana aplicaiei.
Pentru a putea interaciona cu session trebuie s folosim clasa System.Web.SessionState.
HTTPSessionState, ce este furnizat n pagina noastr web ca un obiect predefinit de tip Session.
Dac vrem s adugm elemente n colecia noastr i s le extragem este ca i cum vrem s
adugm elemente la view-state-ul paginii. De exemplu, pentru a memora un DataSet n memoria
Session - ului avem:
Session["DataSet"] = ds;
Pentru a extrage informaia, vom folosi conversie:
ds = (DataSet)Session["DataSet"];
nainte de accesa obiectul ds, trebuie verificat mai nti dac acesta exist.
Starea sesiunii a utilizatorului curent este global ntregii aplicaii. Aceasta se poate pierde n
urmtoarele situaii:
-
Dac sesiunea expir (adic trece un anumit timp n care utlizatorul nu face nimic).Despre
40
obiectul BrowserCapabilities.
AutoDetect - ASP .NET incearc s afle dac browserul utilizatorului suport sau nu
cookie-urile, ncercnd s seteze i sa extrag un cookie. Aceast metod determin dac
un browser suport sau nu cookie-urile, dar n cazul n care acestea sunt dezactivate se va
folosi opiunea de cookieless.
O setare important a strii sesiunii din web .config este timeout-ul. Acesta specific
numrul de minute ateptate de ASP .NET fr a primi o cerere nainte de a se abandona sesiunea.
Aceast setare reprezint unul din cele mai importante compromisuri al strii sesiunii. O diferen
de minute poate avea un efect dramatic asupra ncrcrii serverului i a performanei aplicaiei.
Cel mai bine ar fi s se aleag un interval de timp suficient de scurt pentru a permite server-ului
s revendice o important parte de memorie dup ce un client nu mai utilizeaz aplicaia
respectiv. Totui, acest interval de timp trebuie s fie suficient de lung pentru a permite
utilizatorului s ia o pauz i s i continue sesiunea fr s-o piard. Timeout-ul sesiunii poate fi
schimbat din cod. Dac se tie c o sesiune conine o cantitate mare de informaii, probabil va fi
nevoie de setarea unei limite de timp. De exemplu:
Session.Timeout = 10;
41
Pentru a putea utiliza aceste controale, trebuie s nelegem ciclul vieii unei pagini:
1. Se creeaz obiectul Page (bazat pe pagina cu extensia .aspx).
2. Se declaneaz evenimentele de Page.Init i Page.Load.
3. Se declaneaz toate celelalte evenimente ale controalelor.
4. Dac utilizatorul face vreo schimbare, controalele cu surse de date ii vor desfura
operaiile de updatare. Dac un rnd este updatat, evenimentele Updating i Updates vor fi
declanate. Dac un rnd este ters, evenimentele Deleting i Deleted vor fi declanate.
5. Se declaneaz evenimentul de Page.PreRender.
6. Controalele cu surse de date i execut interogrile i se populeaz controalele cu datele
specificate. Acest pas se va executa atunci cnd se face pentru prima oar PostBack la pagin,
iar la fiecare PostBack se asigur c avem date actuale. Evenimentele declanate sunt
Selecting i Selected.
7. Pagina este afiat.
Paii 4 i 6 constituie paii n care controalele intervin n acest proces.
2.10.2 SqlDataSource
ASP .NET furnizeaz un control numit SqlDataSource, care, dup cum sugereaz i
numele, este folosit pentru extragerea informaiilor din baza noastr de date.
<asp:SqlDataSource ID="SqlDataSource1" runat="server" ... />
De fapt, acest control reprezint o conexiune la baza de date ce folosete furnizorul
ADO.NET. SqlDataSource-ul are nevoie de un mod generic de a crea conexiunea, comanda
aferent i obiectele de tip DataReader. Acest lucru este posibil dac furnizorul nostru de date ne
42
poate oferi anumite date. Din fericire, .NET furnizeaz aceste date pentru fiecare din cei patru
furnizori:
System.Data.SqlClient
System.Data.OracleClient
System.Data.OleDb
System.Data.Odbc
Numele de furnizor System.Data.SqlClient este implicit i poate fi omis.
Se pot folosi oricare din cei patru furnizori mpreun cu SqlDataSource, iar numele
furnizorului va trebui setat ca n exemplul:
<asp:SqlDataSource ProviderName="System.Data.SqlClient" ... />
n continuare, trebuie s adugm stringul de conexiune, care este foarte important, cci
prin intermediul lui se realizeaz conexiunea la baza de date. Acesta se poate introduce n tagul
de SqlDataSource sau poate fi scris n seciunea <connectionStrings> din fiierul web.config. Cea
de-a doua variant e mult mai flexibil i n cazuri extreme, se asigur faptul c stringul de
conexiune nu se va modifica.
<configuration>
<connectionStrings>
<add name="AspNetDb" connectionString=
"Data Source=.\SQLEXPRESS;AttachDbFilename="C:\Users\
Documents\App_Data\ASPNETDB.MDF";Integrated
Security=True;Connect Timeout=30;User Instance=True
"/>
</connectionStrings>
...
</configuration>
Pentru a scrie stringul de conexiune n tagul controlului SqlDataSource putem folosi
urmtoarea sintax:
<asp:SqlDataSource ConnectionString="<%$
ConnectionStrings:AspNetDb %>" ... />
n continuare, putem folosi SqlDataSource-ul pentru a face o cerere Sql putem face
select, update, delete, n funcie de ceea ce avem nevoie. Pentru acestea, controlul deine anumite
proprieti: SelectCommand, InsertCommand, UpdateCommand i DeleteCommand. Toate
ateapt un string. Acesta poate fi introdus att pe pagina noastr .aspx, ct i din cod C#.
Stringul poate conine SQL inline n acest caz avem SelectCommandType,
InsertCommandType, UpdateCommandType sau DeleteCommandType care pot corespunde cu
numele unei proceduri n acest caz avem StoredProcedure. De exemplu, dac vrem s extragem
43
toi utilizatorii din baza noastr de date i s populm un drop down cu informaiile existente,
definim mai nti un SqlDataSource cu comanda de select aferent, dup care adugm un
DropDownList pe care l legm de SqlDataSource-ul ce are id-ul corespunztor(folosind
proprietatea DataSourceId).
<asp:SqlDataSource ID="MyUsers" runat="server"
ConnectionString="<%$ ConnectionStrings:AspNetDb %>"
SelectCommand="SELECT user_name, user_id FROM
aspnet_users"/>
<asp:DropDownList ID="Users" runat="server"
AutoPostBack="True"
DataSourceID="MyUsers" DataTextField="user_name"
DataValueField="user_id" />
Toate controalele ce permit popularea lor cu date dinamice, permit i modificarea
proprietii DataValueField, ce atribuie informaia corespunztoare atributului din controlul
respectiv. Acest lucru ne permite de a memora date importante ce nu sunt afiate. De exemplu,
putem defini cele dou proprieti astfel:
Users.DataTextField = "Valoare";
Users.DataValueField = "Cheie";
n funcia ce trateaz evenimentul corespunztor schimbrii unei opiuni din lista
noastr( PostBack trebuie setat true), vom putea extrage i cheia(id-ul) elementului ce a fost
selectat:
protected void Users_SelectedIndexChanged(Object sender,
EventArgs e)
{
Label1.Text = "Userul ales: " + Users.SelectedItem.Text;
Label2.Text = " Cu id-ul: " + Users.SelectedItem.Value;
}
pagin.
<asp:QueryStringParameter> Reprezint valoarea din stringul interogrii
curente.
<asp:SessionParameter> Reprezint valoarea memorat n sesiunea utilizatorului
curent.
<asp:CookieParameter> Reprezint valoarea de la orice cookie asociat cererii
curente.
<asp:ProfileParameter> Constituie o valoare din profilul curent al utilizatorului.
<asp:RouteParameter> Reprezint o valoare din URL-ul rutat. URL-urile rutate
reprezint o metod avansat ce permite maparea oricrui URL ctre orice alt pagin.
<asp:FormParameter> Constituie o valoare trimis paginii dintr-un input. De obieci,
se folosete proprietatea controlului respectiv, dar este de preferat s se extrag valoarea
dorit exact din colecia de Form-uri n caz c view state-ul este dezactivat pentru acel
control.
n unele situaii, avem nevoie de folosirea tagului <asp:Parameter> prin care s ne definim
parametrul. Valoarea sa va fi setat din codul de pe partea de server. SqlDataSource cuprinde
45
anumite evenimente responsabile pentru setarea valorilor parametrilor. Acetia se pot seta n urma
declanrii evenimentului Selecting; similar, se pot folosi i evenimentele de Updating, Deleting
sau Inserting n urma modificrii, tergerii sau a inserrii. n handlerii pentru aceste evenimente,
putem accesa comanda ce urmeaz a fi executat(folosind proprietatea Command al obiectului
EventArgs). SqlDataSource furnizeaz i evenimente precum Selected, Updated,
Deleted i Inserted care au loc dup ce interogrile au fost fcute, deci ar fi prea ttziu pentru a
mai schimba valoarea parametrilor. Pentru a seta valoarea unui parametru(ce reprezint o dat)
adugnd la acesta nc cinci ani:
protected void sourceOrders_Selecting(object sender,
SqlDataSourceSelectingEventArgs e)
{
e.Command.Parameters["@Data"].Value =
DateTime.Today.AddYears(5);
}
46
n acest exemplu, numele parametrilor nu sunt alei arbitrar. Parametrii nu trebuie definii
separat dac le dm acelai nume cu cmpul din baza de date(cu @ n fa). Acest lucru este
permis deoarece ASP .NET introduce toi parametrii ntr-o colecie nainte de a avea loc updateul. Fiecare parametru din colecie respect convenia de nume, fapt ce ce ne salveaz mult din
timp. De asemenea, trebuie oferit utilizatorului o metod de a introduce noi valorip. De
exemplu, putem utiliza DetailsViews ce furnizeaz posibilitatea de a edita nregistrri din baza de
date(proprietatea AutoGenerateEditButton va fi setat True):
<asp:DetailsView runat="server" ID="Inregistrari"
DataSourceID="mySource" AutoGenerateEditButton="True" />
La o comand de update vom avea probleme dac doi utilizatori acceseaz n acelai timp
pagina ce conine aceste nregistrri. Dac cei doi utilizatori vor face modificri pe aceeai
cmpuri, pot aprea probleme. Acestea se pot rezolva folosind metoda concurenei match-allvalues. n aceast situaie, comanda de update va eua dac nregistrrile originale au fost
modificate ntre timp. n clauza where va trebui s punem condiii de egalitate pe toate
cmpurile respective. De asemenea, trebuie ntiinat SqlDataSource-ul pentru a menine valorile
vechi din sursa de date i de a le furniza numele parametrilor ce ncep cu _original. Astfel, va
trebui s setm dou proprieti: SqlDataSource.ConflictDetection se va seta
ConflictOptions.CompareAllValues n loc de ConflictOptions.OverwriteChanges (ce era
implicit). Proprietatea OldValuesParameterFormatString se va seta cu textul original_{0}, care
spune DataSource-ului s insereze textul _original nainte de numele cmpului pentru a crea
parametrul ce deine vechea valoare. SqlDataSource-ul nu va arunca nici o excepie dac nici un
update nu va fi efectuat. Pentru a verifica acest lucru, putem folosi proprietatea
SqlDataSourceStatusEventArgs.AffectedRows. Dac aceasta are valoare 0, nici o nregistrare nu
a fost updatat, iar utilizatorul ar trebui ntiinat de problema de concuren ce a mpiedicat
update-ul:
protected void UpdatedInfo(object sender,
SqlDataSourceStatusEventArgs e)
{
if (e.AffectedRows == 0)
{
Label1.Text = "Nu s-a realizat nici un update.
Comanda este incorect sau s-a ivit o problem de
concuren
}
else
{
47
Aceast metod de rezolvare a concurenei nu este foarte eficient pentru o baz de date
mare. n aceast situaie, putem s adugm o coloan la tabelul respectiv de tip timestamp, ce va
fi folosit pentru a verifica existena concurenei. Timestamp-ul este un cmp special folosit
pentru a ine evidena strii unui cmp. Dac se realizeaz o schimbare asupra unui cmp, n baza
de date timestamp-ul se va modifica i va primi o alt valoare. Scopul acestui timestamp este de a
uura verificarea concurenei. Atunci cnd vrem s facem un update pe un tabel ce include un
cmp timestamp, trebuie folosit n condiia where:
UpdateCommand="UPDATE Users SET UserName=@UserName,
ImageUrl = @ImageUrl, BirthDate = @BirthDate
WHERE UserId=@UserId AND RowTimestamp=@RowTimestamp"
Id-ul utilizatorului este necesar pentru a identifica nregistrarea corespunztoare. Dac
valoarea din coloana RowTimestamp va coincide cu cea dat, vom ti c nregistrarea respectiv
nu a fost modificat. Valoarea actual a timestamp-ului nu este important, deoarece aceasta este
controlat de baza de date. Trebuie s tim doar dac respectiva valoare s-a schimbat ntre timp.
Crearea unui timestamp este uoar: de exemplu, n SqlServer se poate crea un cmp timestamp
folosind tipul de dat timestamp.
DESCRIEREA APLICAIEI
3.1 Descrierea aplicaiei
Aceas aplicaie este o aplicaie web care furnizeaz un calendar ce permite utilizatorilor
de a-i crea evenimente de care vor fi notificai in prealabil.
48
Am folosit login-ul implicit al ASP-ului i am modificat tabelul User din baza de data
furnizat de ASP, adugnd coloanele Skin i Picture, n care am memorat numele ultimului tip
de skin ales de utilizator i numele pozei de profil. La aceast baz de date am mai adugat
tabelul Events n care se memoreaz evenimentele fiecrui utilizator i in care avem detalii
despre evenimentul respectiv, precum titlul, ora, data etc.
Formularul de login cuprinde validatori de prezen pentru cele dou cmpuri(numele
utilizatorului i parola). Evident, dac nu sunt coincid valorile inserate cu cele din baza de date,
se va semnala un mesaj de eroare.
51
Fiecare pagin creat poate fi accesat doar dac utilizatoul este logat. Aa c, n funcia
de Page Load a fiecrei pagini am testat:
if (User.Identity.IsAuthenticated)
{
userID = Membership.GetUser().ProviderUserKey.ToString()
}
else Response.Redirect("Default.aspx");
De asemenea, pentru vizualizarea paginii de profil a utilizatorului este necesar extragerea
pozei de profil a utilizatorului(ce apare n partea de sus a paginii) i tema curent a calendarului.
if (!Page.IsPostBack)
{
SqlCommand extractPicture = new SqlCommand("select Picture
from aspnet_Users where UserId = '" + userID + "'", c);
SqlCommand extractSkin = new SqlCommand("select Skin from
aspnet_Users where UserId = '" + userID + "'", c);
c.Open();
dr = extractPicture.ExecuteReader(CommandBehavior.
CloseConnection);
while (dr.Read())
{
src = dr["Picture"].ToString();
}
Image1.ImageUrl = src;
dr.Close();
c.Open();
dreader = extractSkin.ExecuteReader(CommandBehavior.
CloseConnection);
while (dreader.Read())
{
skin = dreader["Skin"].ToString();
}
dreader.Close();
}
De asemenenea, tot in funcia de Page Load, trebuie populat i dropdown-ul ce conine
tipurile de fundaluri ale calendarului. Valoarea selectat va fi cea regsit n baza de date.
if (!Page.IsPostBack)
{
string[] sArray1 = new string[] { "implicit", "Fundal1",
"Fundal2", "Fundal3" };
DropDownList1.DataSource = sArray1;
DropDownList1.DataBind();
DropDownList1.SelectedValue = skin;
52
}
Atunci cnd un user se logheaz i se afieaz calendarul cu toate evenimentele din ziua
respectiv, dar se poate alege i o alt zi pentru a vedea i alte evenimente. Atunci cnd se alege o
alt zi se face PostBack la pagin (deoarece obiectul asp:Calendar are setat proprietatea
autoPostBack ca fiind true) i se declaneaz un eveniment cu numele de OnSelectionChanged,
ce apeleaz o funcie n care se modific data(data curent va deveni data selectat) i se va
interoga baza de date pentru a extrage evenimentele din data respectiv. Vom memora datele
despre aceste evenimente n nite variabile. Prin PostBack, se va rencrca i partea de client i
astfel, n JavaScript vom accesa variabilele respective din C# (care trebuie declarate ca variabile
publice). De exemplu:
saptamana = "<%= this.week %>"
Deci, prin intermediul PostBack-ului i a comunicrii client-server, vom avea afiate
evenimentele corespunztoare n funcie de data selectat de utilizator.
53
toate perechile de ore din timpul unei zile(de la 00:00-01:00 pn la 23:00-00:00), iar div-urile
din partea dreapt conin evenimentele ce ncep la ora ce este scris n div-ul din partea stng.
La acestea le-am adugat dinamic o clas n care le-am setat diverse proprieti, precum
background, padding, margin, float, minHeight etc. Aceste proprieti sunt importante pentru
designul calendarului.
Pentru a corela div-urile din stnga cu cele din dreapta, am setat id-ul fiecrui element din
dreapta ca fiind egal cu orele ce corespund evenimentului de pe linia respectiv (prin variabila
unique_id).
Acest id este foarte necesar deoarece la onClick trebuie s se poat aduga evenimente la
ora corespunztoare elementului pe care s-a dat click(vom folosi setAttribute).
calendar2.id = unique_id;
calendar2.setAttribute('onClick', 'addEvent("' + unique_id
+ '",event)');
n funcia de addEvent trebuie s redirecionm ctre o pagin cu extensia .aspx(folosind
window.location.href) i s transmitem acest id (n C# vom putem accesa variabilele din URL,
folosind Request. QueryString).
if (Request.QueryString["nr"] != null)
idEvent = Request.QueryString["nr"];
Dup ce s-a adugat un eveniment(vom detalia acest proces n capitolul Adugarea de
evenimente), se redirecioneaz pe pagina principal, n care calendarul nostru va aprea
updatat, coninnd i evenimentul proaspt adugat. Astfel, pe partea de client va trebui s
accesm anumite variabile din code-behind ce conin detalii despre evenimentul respectiv, n
special culoarea i titlul (avem nevoie de acestea atunci cnd afiam evenimentul respectiv).
54
Calendar sptmnal este sincronizat cu data selectat (adic va conine sptmna n care
exist data respectiv). Am creat o funcie ce seteaz un vector cu datele sptmnii curente.
Aceasta se va apela att n PageLoad (dac nu se face PostBack), ct i din metoda apelat n
urma schimbrii datei. Acest vector se va actualiza n funcie de ziua datei selectate. De exemplu,
dac ziua selectat va fi zi de Luni, atunci avem:
if (Calendar1.SelectedDate.DayOfWeek.ToString() == "Monday")
{
for(k = 0 ;k < n ; k++)
{
saptCurenta[k] = (Calendar1.SelectedDate.AddDays(k));
}
}
Calendarele pot avea mai multe skinuri pe care le alege utilizatorul n funcie de
preferine. Utilizatorul poate alege dintr-un drop-down un anumit skin. Acest drop-down are
ataat un eveniment OnSelectedIndexChanged.Astfel, cnd se va alege o alt tem pentru
calendar, se va apela o anumit funcie n care se va updata valoarea Skin-ului din baza de date a
utilizatorului curent.
string userID = Membership.GetUser().ProviderUserKey.ToString();
skin = DropDownList1.SelectedValue;
55
56
Evenimentele ce au setat notificarea prin e-mail apar cu alt background, iar evenimentele
ce dureaz mai mult de o or n aceeai zi va avea proprietatea ca, la hover pe eveniment,
utilizatorul va putea vedea, de fapt, ct dureaz evenimentul.
el.setAttribute('onMouseOver',
'setHours(\''+hour+'\','+random_id+')');
el.setAttribute('onMouseOut',
'outsetHours(\''+hour+'\','+random_id+)');
function setHours(ora,id)
{
var el = document.getElementById(id);
var durata = document.createElement('div');
durata.innerHTML = ora ;
durata.className = "durataEv";
el.appendChild(durata);
}
function outsetHours(ora,id)
{
var el = document.getElementById(id);
//stergem fiii
if (el.hasChildNodes())
{
for (var i = 0; i < el.childNodes.length; i++)
if(el.childNodes[i].className == "durataEv")
{
el.removeChild(el.childNodes[i]);
}
}
}
Titlul evenimentelor poate depi mrimea predefinit a div-urilor n care sunt afiate
acste evenimente. De aceea, am creat o funcie n JavaScript ce asigur, n cazul n care titlul
evenimentului depete numrul maxim de caractere permise nlocuirea acestora cu puncte de
suspensie:
if(numeEv[i][j].length > max_length)
{
for(s = 0 ; s < max_length - 2 ; s++ )
elem.innerHTML += numeEv[i][j][s];
elem.innerHTML += "...";
}
57
58
59
Se pot edita numele evenimentelor, orele, data , culoarea , setrile notificrilor sau se pot
vizualiza invitaii deja existeni si se pot aduga alii.
tergerea evenimentului se va efectua condiionat, doar dac utilizatorul va confirma
aceast aciune. Aceast confirmare am realizat-o prin intermediul comunicrii ntre JavaScript i
C#. Iniial, fereastra cu alertarea utilizatorului este ascuns i apare doar n cazul n care se d
click pe butonul de tergere a evenimentului. n pagin avem dou butoane:
<asp:Button ID="DeleteButton" style="display: none;"
runat="server" Text="Sterge eveniment"onClick="deleteEvent" />
<input id="DeleteButtonHTML" type="button" name="test"
value="Sterge eveniment" onclick="Verificare();" />
Primul buton este ascuns, ns are un rol foarte important decoare la onClick pe acesta se
declaneaz tergerea evenimentului respectiv. De aceea, am fcut un mic truc, genernd click
pe buton dintr-o funcie n JavaScript, ce se va declana cnd se apas da:
function StergeEveniment()
{
document.getElementById("DeleteButton").click();
document.getElementById("div_mare").style.display = "none";
document.getElementById("div_conf").style.display = "none";
}
60
Dac utilizatorul alege opiunea de a nu terge evenimentul, vom realiza doar ascunderea
elementelor HTML.
function NuStergeEveniment()
{
document.getElementById("div_mare").style.display = "none";
document.getElementById("div_conf").style.display = "none";
}
Pe partea de code-behind, vom realiza tergerea evenimentului din baza de date:
if (Request.QueryString["nr"] != null)
idEvent = Request.QueryString["nr"];
deletestr = "delete from Events where id_event ="+idEvent ;
SqlCommand SqlCommand1 = new SqlCommand(deletestr, c);
c.Open();
SqlCommand1.ExecuteNonQuery();
63
64
65
dr2 = setEmail.ExecuteReader(CommandBehavior.
CloseConnection);
while (dr2.Read())
{
email = dr2["Email"].ToString();
}
}
Apoi setm anumite proprieti:
var smtp = new System.Net.Mail.SmtpClient ("smtp.gmail.com",
587);
smtp.EnableSsl = true;
smtp.UseDefaultCredentials = false;
smtp.Credentials = new System.Net.NetworkCredential
("cruceanudaniella22@gmail.com","");
try
{
Label2.Text = "Mail trimis la "+email;
System.Net.Mail.MailMessage message = new System.Net.Mail.
MailMessage();
message.To.Add(email);
message.Subject = "Nu uita: " + dr["nume_event"];
message.Body = "Nu uita evenimentul! Incepe in :
"+dr["email_setat"]+" minute";
smtp.Send(message);
message = null;
}
catch (Exception exc)
{
Console.WriteLine("Eroare trimitere e-mail: " + exc);
}
66
69
BIBLIOGRAFIE
1. Microsoft Visual C# 2012 Step by Step, John Sharp, Ed. Microsoft Press, 2012
2. Beginning Object-Oriented Programming with C#, Jack Purdum, Ed. Wiley / Wrox, 2012
3. Microsoft ASP.NET 4 Step by Step, George Shepherd, Ed. Microsoft Press, 2010
4. Professional C# 4.0 and .NET 4, Bill Evjen, Morgan Skinner, Jay Glynn, Karli Watson,
Christian Nagel, Ed. Wiley / Wrox, 2010
5. Beginning ASP.NET 4.5: in C# and VB, Imar Spaanjaars, Ed. Wiley / Wrox, 2012
6. Developer's Guide to Collections in Microsoft .NET, Calvin "Lee" Janes, Ed. Microsoft
Press, 2011
7. Beginning ASP.NET 4.5 in C#, Matthew MacDonald, Ed. Apress, 2012
8. www.msdn.microsoft.com
70