Sunteți pe pagina 1din 31

ASP.NET – continuare 1/31 15.05.

2013

Rezumat
Configurare

Managementul starii
 ViewState
 Transfer intre pagini
 Cookies
 Session
 Application
 Variabile statice ale aplicatiei

Data Binding
 valori simple
 lista de valori
 asociere la DataReader

Surse de date
 SqlDataSource
 ObjectDataSource

Teme

Master Page

Ioan Asiminoaei
ASP.NET – continuare 2/31 15.05.2013

Configurare ASP.NET
Se realizeaza prin intermediul fisierelor XML.
Acestea nu sunt niciodata blocate si sunt usor de accesat si replicat (cu existenta drepturilor
necesare).

Fisierul machine.config

Se gaseste in directorul C:\windows\Microsoft.Net\Framework\”versiune_net”\Config.


Este bine comentat si poate fi folosit pentru crearea unui fisier de configurare propriu.

<machineKey>

Aceasta sectiune permite de a seta chei specifice (pe partea de server) folosite pentru criptarea
datelor si de a crea semnaturi digitale.
ASP.NET foloseste aceste chei pentru a proteja autentificarea si informatia din view state.

Elementul <machinekey> are urmatoarea forma :

<machineKey validationKey="AutoGenerate,IsolateApps"
decryptionKey="AutoGenerate,IsolateApps"
validation="SHA1"
/>

Valorile AutoGenerate si IsolateApps indica ca ASP.NET va crea si memora chei specifice


pentru calculator si pentru aplicatie. Fiecare aplicatie foloseste o cheie distincta, generata in mod
automat.

Daca nu se doreste acest lucru, putem alege sa folosim o singura cheie pentru toate aplicatiile de
pe calculatorul curent, cum ar fi :

<machineKey validationKey="AutoGenerate"
decryptionKey="AutoGenerate"
validation="SHA1"
/>

Web farm = un grup de servere Web ce sunt controlate local, dar gestionate centralizat. Fiecare
site Web este administrat de Webmaster propriu. Monitorizare centralizata, “load balnacing” si o
toleranta mai buna la erori.

Server farm = o multime de calculatoare ce ruleaza (in mod obisnuit) acelasi sistem de operare
configurate pentru “load balancing” fiecare server expunand aceleasi aplicatii catre utilizatorii
finali. Se remarca existenta unei aplicatii ce realizeaza aceasta procesare distribuita.

Daca se foloseste un web farm si se ruleaza aceeasi aplicatie pe mai multe calculatoare, atunci
cheia de criptare trebuie sa fie aceeasi sau la nivel de masina trebuie sa fie definita in
machine.config.

<machineKey
validationKey="61EA54E005915332011232149A2EEB317586824B265326CCDB3AD9ABDBE9D
6F24B0625547769E835539AD3882D3DA88896EA531CC7AFE664866BD5242FC2B05D"
decryptionKey="61EA54E005915332011232149A2EEB317586824B265337AF"
validation="SHA1" />

Ioan Asiminoaei
ASP.NET – continuare 3/31 15.05.2013

Observatie: Cheia de criptare poate fi specificata si in web.config plasat in directorul virtual.

Cheia de validare – validationKey - poate avea lungimea in intervalul [40, 128].


Cheia de decriptare – decryptionKey - poate avea o lungime de 16 sau 48 caractere.
Daca lungimea este 16 se foloseste criptarea DES (Data Encryption Standard).
Daca lungimea este 48 se foloseste Triple DES (sau 3DES) – DES este aplicat de trei ori
consecutiv.
In caz contrar (lungime cheie diferita de 16 sau 48) se va raporta o eroare.

Pentru a genera aceste chei ar trebui sa folosim calsele din System.Security.Cryptography.

Exemplu :

Rezultatul executiei acestei metode trebuie plasat in machine.config.

public static string CreateMachineKey(int length)


{
// Create a byte array.
byte[] random = new byte[length/2];

// Create a cryptographically strong random number generator.


RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();

// Fill the byte array with random bytes.


rng.GetBytes(random);

// Create a StringBuilder to hold the result once it is


// converted to hexadecimal format.
System.Text.StringBuilder machineKey =
new System.Text.StringBuilder(length);

// Loop through the random byte array and append each value
// to the StringBuilder.
for (int i = 0; i < random.Length; i++)
{
machineKey.Append(String.Format("{0:X2}", random[i]));
}
return machineKey.ToString();
}

Putem alege algoritmul pentru hash al campului view state.


Recomandare : SHA1.
Alti algoritmi: MD5 – Message Digest 5 -; AES (Rijndael) sau 3DES.

Fisierul web.config
Fiecare aplicatie web mosteneste setari din machine.config si fisierul web.config din radacina
directorului virtual.

Forma de baza a fisierului web.config este:

<?xml version="1.0"?>
<configuration>
<appSettings />

Ioan Asiminoaei
ASP.NET – continuare 4/31 15.05.2013

<connectionStrings />
<system.web>
<!-- ASP.NET configuration sections go here. -->
</system.web>
</configuration>

In ASP.NET 3.5 s-au adaugat sectiuni noi la fisierul de configurare.

<?xml version="1.0"?>
<configuration>
<configSections />
<appSettings />
<connectionStrings />
<system.web />
<system.codedom />
<system.webServer />
</configuration>

Mostenirea configurarii
Directorul virtual poate contine mai multe subdirectaore.
Aceste subdirectoare pot contine fisiere proprii web.config.

Mostenirea configurarii – inseamna ca fiecare subdirector isi ia setarile din directorul parinte.

Ordinea aplicarii setarilor este :


1. machine.config
2. web.config din “radacina” calculatorului
3. se aplica pe rand web.config (daca exista) din fiecare subdirector, ordinea de parcurgere
fiind de la stanga la dreapta, urmand adresa din browser, ex.
http://localhost/A/B/C/Page1.aspx.

Elementul <location>

Elementul <location> este o extensie ce permite specificarea mai multori grupuri de setari in
acelasi fisier de configurare.
Atributul path se va folosi pentru a specifica subdirectorul sau fisierul la care se aplica aceste
setari.

Exemplu : se creaza doua grupuri, unul pentru directorul curent si unul ce se aplica numai
fisierelor din subdirectorul cu numele Secure.

<configuration>
<system.web>
<!-- Basic configuration settings go here. -->
</system.web>
<location path="/Secure">
<system.web>
<!-- Configuration settings for the Secure
subdirectory go here. -->
</system.web>
</location>
</configuration>

Ioan Asiminoaei
ASP.NET – continuare 5/31 15.05.2013

Acest fisier joaca rolul a doua fisiere de configurare. Setarile din <location> pot fi plasate
intr-un fisier de configurare ce se va gasi in directorul Secure.

<system.web>

Contine configurari referitoare la securitatea serviciilor, managementul starii.


Schema pentru <system.web> este fixa.

Cateva elemente de baza din <system.web>

authentication – determina modul cum se verifica identitatea clientului cand acesta


acceseaza o pagina. Se seteaza la nivel de aplicatie.

authorization – controleaza ce clienti au acces la resursele din cadrul unei aplicatii web
sau a directorului curent.

sessionState – configureaza optiuni pentru gestionarea starii sesiunii aplicatiei.

<connectionStrings>

Permite definirea stringului de conexiune la baza de date.


Pot exista mai multe stringuri de conexiune, diferentirea facandu-se prin “name”.

<configuration>
<connectionStrings>
<add name="NorthwindConnection"
connectionString=
"Data Source=localhost;Integrated Security=SSPI;Initial Catalog=Northwind;"
providerName="System.Data.SqlClient" />
</connectionStrings>
<system.web>...</system.web>
</configuration>

<appSettings>

<?xml version="1.0"?>
<configuration>
<appSettings>
<!-- Custom application data goes here. -->
</appSettings>
<system.web>...</system.web>
</configuration>

Setarile sunt date ca simple variabile de tip string.


Aceste setari folosesc elementul <add> ce identifica un nume unic de variabila.

<?xml version="1.0" ?>


<configuration>
<appSettings>
<add key="websiteName" value="My New Website"/>
<add key="welcomeMessage" value="Welcome to my new Website, friend!"/>

Ioan Asiminoaei
ASP.NET – continuare 6/31 15.05.2013

</appSettings>
<system.web>...</system.web>
</configuration>

Regasirea informatiilor se face folosind clasa ConfigurationSettings din spatiul de nume


System.Configuration.

Proprietatea AppSettings contine o colectie a setarilor disponibile pentru aplicatie.

In urmatorul exemplu se completeaza doua label-uri folosind valori din fisierul de configurare.

protected void Page_Load(object sender, EventArgs e)


{
lblSiteName.Text = ConfigurationManager.AppSettings["websiteName"];
lblWelcome.Text = ConfigurationManager.AppSettings["welcomeMessage"];
}

Citirea si scrierea sectiunilor de configurare in mod programabil

Clasa folosita este WebConfigurationManager din spatiul de nume


System.Web.Configuration si permite extragerea informatiilor din fisierul de configurare la
runtime.

Membri importanti din aceasta clasa :

AppSettings – acces la informatii din sectiunea <appsettings>. Setarile individuale sunt


furnizate printr-o colectie indexata prin numele variabilelor.

ConnectionStrings – acces la informatii din sectiunea <connectionStrings>. Setarile individuale


sunt furnizate printr-o colectie indexata prin numele variabilelor.

Criptarea sectiunilor de configurare

ASP.NET nu returneaza catre client cereri din fisierul de configurare.

ASP.NET suporta doua optiuni pentru criptare:

Ioan Asiminoaei
ASP.NET – continuare 7/31 15.05.2013

RSA: - permite crearea unei perechi de chei folosite in criptarea datelor din fisierul de
configurare. Este optiunea implicita.

DPAPI: (data protection API) furnizeaza un mecanism de protectie preconstruit in Windows.


Fisierele de configurare sunt criptate folosind o cheie specifica masinii.

Ambele optiuni sunt transparente pentru utilizator.

Criptare programabila
Clasa folosita este ConfigurationSection.SectionInformation, iar metoda este
ProtectSection().
Daca dorim sa revenim (fara criptare) metoda este UnprotectSection().

Exemplu:

Configuration config = WebConfigurationManager.OpenWebConfiguration("/");


ConfigurationSection appSettings = config.GetSection("appSettings");
if (appSettings.SectionInformation.IsProtected)
{
appSettings.SectionInformation.UnprotectSection();
}
else
{
appSettings.SectionInformation.ProtectSection(
"DataProtectionConfigurationProvider");
}
config.Save();

Ioan Asiminoaei
ASP.NET – continuare 8/31 15.05.2013

Managementul starii

ViewState
Proprietatea din Page este ViewState.

Se pot memora tipuri de date simple si obiecte construite de dezvoltator.


ViewState se bazeaza pe o colectie de tip dictionar, indexata prin nume.

ViewState["Counter"] = 1;

E necesar cast la regasirea valorilor.

int counter;
if (ViewState["Counter"] != null)
{
counter = (int)ViewState["Counter"];
}

Exemplu cu ViewState

public partial class ViewStateTest : System.Web.UI.Page


{
protected void cmdSave_Click(object sender, System.EventArgs e)
{
// Save the current text.
SaveAllText(Table1.Controls, true);
}

private void SaveAllText(ControlCollection controls, bool saveNested)


{
foreach (Control control in controls)
{
if (control is TextBox)
{
// Store the text using the unique control ID.
ViewState[control.ID] = ((TextBox)control).Text;
}
if ((control.Controls != null) && saveNested)
{
SaveAllText(control.Controls, true);
}
}
}

protected void cmdRestore_Click(object sender, System.EventArgs e)


{
// Retrieve the last saved text.
RestoreAllText(Table1.Controls, true);
}

private void RestoreAllText(ControlCollection controls, bool saveNested)


{
foreach (Control control in controls)
{
if (control is TextBox)
{

Ioan Asiminoaei
ASP.NET – continuare 9/31 15.05.2013

if (ViewState[control.ID] != null)
((TextBox)control).Text = (string)ViewState[control.ID];
}
if ((control.Controls != null) && saveNested)
{
RestoreAllText(control.Controls, true);
}
}
}
}

Memorare obiecte in ViewState

Ideea este de a converti obiectul intr-un stream de bytes astfel incat acesta poate fi adaugat la un
camp ascuns din pagina. Asta inseamna proces de serializare. In concluzie, obiectul trebuie sa fie
serializabil, deci marcat cu atributul [Serializable]. Toti membri din calsa trebuie sa fie
serializabili, iar daca nu sunt trebuie marcati cu atributul [NonSerialized].

Nu uitati de cast.

[Serializable]
public class Customer
{
public string FirstName;
public string LastName;

Ioan Asiminoaei
ASP.NET – continuare 10/31 15.05.2013

public Customer(string firstName, string lastName)


{
FirstName = firstName;
LastName = lastName;
}
}

Exemplu

Memorare
// Store a customer in view state.
Customer cust = new Customer("Marsala", "Simons");
ViewState["CurrentCustomer"] = cust;

Regasire informatie

// Retrieve a customer from view state.


Customer cust;
cust = (Customer)ViewState["CurrentCustomer"];

Transfer informatii intre pagini

QueryString , Cookies, Session, Application

QueryString
Portiunea de dupa URL delimitata de ? si apoi separata prin &.

Dezavantaje :
 informatie putina ;
 securitate.
 mentenanta dificila a aplicatiei.

Utilizare Query String


Pentru plasarea informatiei in acest caz trebuie sa folosim un control de tip HyperLink sau
instructiunea Response.Redirect().

// Go to newpage.aspx. Submit a single query string argument


// named recordID and set to 10.
int recordID = 10;
Response.Redirect("newpage.aspx?recordID=" + recordID.ToString());

Regasirea informatiei:

string ID = Request.QueryString["recordID"];

Daca nu exista, ID va fi null.

Ioan Asiminoaei
ASP.NET – continuare 11/31 15.05.2013

Apelul intre pagini

Numai cu controale ce implementeaza interfata IButtonControl


Proprietatea PostBackUrl (definita in interfata IButtonControl) va fi setata cu numele unui alt
form web.

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="CrossPage1.aspx.cs"


Inherits="CrossPage1" %>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>CrossPage1</title>
</head>
<body>
<form id="form1" runat="server" >
<div>
<asp:TextBox runat="server" ID="txtFirstName"></asp:TextBox> &nbsp;
<asp:TextBox runat="server" ID="txtLastName"></asp:TextBox>
<asp:Button runat="server" ID="cmdSubmit"
PostBackUrl="CrossPage2.aspx" Text="Submit" />
</div>
</form>
</body>
</html>

In CrossPage2.aspx putem interactiona cu obiectele CrossPage1.aspx folosind proprietatea


Page.PreviousPage.

protected void Page_Load(object sender, EventArgs e)


{
if (PreviousPage != null) // important acest control
{
lblInfo.Text = "You came from a page titled " +
PreviousPage.Header.Title;
}
}

Daca dorim sa obtinem valori pentru controale din CrossPage1.aspx, trebuie sa obtinem obiectul
CrossPage1 facand cast pe proprietatea PreviousPage si apoi obtinem valorile din controalele
din CrossPage1.

protected void Page_Load(object sender, EventArgs e)


{
CrossPage1 prevPage = PreviousPage as CrossPage1;
if (prevPage != null)
{
// (Read some information from the previous page.)
}
}

Observatie
Deoarece controalele sunt declarate ca membri protected, pentru a le accesa valorile in alta
pagina va trebui sa definim proprietati pentru acestea, ca in exemplul de mai jos:

Ioan Asiminoaei
ASP.NET – continuare 12/31 15.05.2013

public TextBox FirstNameTextBox


{
get { return txtFirstName; }
}

public TextBox LastNameTextBox


{
get { return txtLastName; }
}

Efectuare cross-page in metode atasate la evenimente


Server.Transfer() trecere de la o pagina la alta – redirectare de pe partea de server.
Pe partea clientului URL nu se schimba.

Server.Transfer("CrossPage2.aspx", true) ;

Se poate accesa Page.PreviousPage.


Aici intra in scena si proprietatea IsCrossPagePostBack.

Ideea e ca trebuie sa putem detecta, cand se trece de la o pagina la alta, ce metoda am folosit.

Pentru pagina sursa (cea ce apeleaza alta pagina), IsPostBack = true.


Pentru pagina destinatie IsPostBack = false.
IsCrossPagePostBack = true pentru pagina sursa.

Metodele Page_Load din cele doua pagini vor folosi aceste proprietati pentru a determina
actiunile ce le au de executat.

Urmatorul cod arata modul de folosire al proprietatilor IsPostBack si IsCrossPagePostBack.


Scenariul este urmatorul : CrossPage1.aspx transfera controlul la CrossPag2.aspx.
In metoda Page_Load() din CrossPag1.aspx scriem urmatorul cod :

protected void Page_Load(object sender, EventArgs e)


{
if (IsCrossPagePostBack)
{
// This page triggered a postback to CrossPage2.aspx.
// Don't perform time-consuming initialization unless it affects
// the properties that the target page will read.
}
else if (IsPostBack)
{
// This page was posted back normally.
// Don't do the first-request initialization.
}
else
{
// This is the first request for the page.
// Perform all the required initialization.
}
}

Ioan Asiminoaei
ASP.NET – continuare 13/31 15.05.2013

Putem obtine valoarea controlului direct din colectia Request:

string name = Request[“txtName”];

unde txtName este numele unui TextBox.

Cookies
Cookies sunt fisiere mici ce sunt create pe HDD client sau in memoria browser-ului.

Pot fi folositi de orice pagina.

Informatia este limitata si foarte simpla.

Anumite browser-e sunt setate sa nu accepte cookie.

Spatiul de nume System.Net.

Obiectele Request si Response furnizeaza o colectie de cookies.

// Create the cookie object.


HttpCookie cookie = new HttpCookie("Preferences");

// Set a value in it.


cookie["LanguagePref"] = "English";

// Add another value.


cookie["Country"] = "US";

// Add it to the current web response.


Response.Cookies.Add(cookie);

Proprietatea Expires seteaza timpul de viata al unui cookie.

// This cookie lives for one year.


cookie.Expires = DateTime.Now.AddYears(1);

Regasirea informatiei din cookie se face astfel – proprietatea Request.Cookies:


HttpCookie cookie = Request.Cookies["Preferences"];
// Check to see whether a cookie was found with this name.
// This is a good precaution to take,
// because the user could disable cookies,
// in which case the cookie would not exist.
string language;
if (cookie != null)
{
language = cookie["LanguagePref"];
}

Ioan Asiminoaei
ASP.NET – continuare 14/31 15.05.2013

SessionState
Informatie memorata intr-o pagina si accesta in oricare alta pagina (in cadrul aceleasi sesiuni).
Se foloseste o colectie.
Informatie salvata in memoria serverului.

ASP.NET creaza pentru fiecare sesiune un ID de 120 biti. ID este unic la nivel de client si
sesiune.

Clasa folosita System.Web.SessionState.HttpSessionState.


Se poate memora o colectie de valori referentiate prin nume sau index. Accesul la valorile
sesiunii si functionalitatea este disponibila folosind clasa HttpSessionState, care este
accesibila prin proprietatea HttpContext.Session sau Page.Session.
Sintaxa folosita pentru a aduga / regasi articole in / din colectie este aceeasi ca la ViewState.

Exemplu memorare DataSet in Session:

Session["ProductsDataSet"] = dsProducts;

iar regasirea informatiei:

dsProducts = (DataSet)Session["ProductsDataSet"];

Observatie. Atentie la cast. Oiectele din Session sunt valabile pe timpul unei sesiuni si nu se pot
transfera de la o sesiune la alta.

Proprietatea Mode arata felul cum sunt pastrate valorile din colectia Session.

MSDN
Valori posibile pentru Mode

Member
name Description

Off Session state is disabled.


InProc Session state is in process with an ASP.NET worker process.
StateServer Session state is using the out-of-process ASP.NET State Service to store state
information.
SQLServer Session state is using an out-of-process SQL Server database to store state
information.
Custom Session state is using a custom data store to store session-state information.

Ioan Asiminoaei
ASP.NET – continuare 15/31 15.05.2013

Alte proprietati de interes pentru aceasta clasa

Name Description
Count Gets the number of items in the session-state collection.
IsCookieless Gets a value indicating whether the session ID is embedded in the URL or
stored in an HTTP cookie.
IsNewSession Gets a value indicating whether the session was created with the current
request.
IsReadOnly Gets a value indicating whether the session is read-only.
IsSynchronized Gets a value indicating whether access to the collection of session-state
values is synchronized (thread safe).
Item[Int32] Gets or sets a session value by numerical index.
Item[String] Gets or sets a session value by name.
Keys Gets a collection of the keys for all values stored in the session-state
collection.
Mode Gets the current session-state mode.
SessionID Gets the unique identifier for the session.
SyncRoot Gets an object that can be used to synchronize access to the collection of
session-state values.
Timeout Gets and sets the amount of time, in minutes, allowed between requests
before the session-state provider terminates the session.
End MSDN

Exemplu de completare fisier de configurare cu Session


<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.web>
<!-- Other settings omitted. -->
<sessionState
mode="InProc"
stateConnectionString="tcpip=127.0.0.1:42424"
stateNetworkTimeout="10"
sqlConnectionString="data source=127.0.0.1;Integrated
Security=SSPI"
sqlCommandTimeout="30" allowCustomSqlDatabase="false"
useHostingIdentity="true"
cookieless="UseCookies" cookieName="ASP.NET_SessionId"
regenerateExpiredSessionId="false"
timeout="20"
customProvider=""
/>
</system.web>
</configuration>

Ioan Asiminoaei
ASP.NET – continuare 16/31 15.05.2013

Securizare stare sesiune

Informatia este securizata deoarece se gaseste pe partea de server.


Sesiunea cu cookies trebuie sa foloseasca SSL pentru a fi sigura.

Request.Cookies["ASP.NET_SessionId"].Secure = true;

Codul va fi folosit imediat dupa ce utilizatorul s-a autentificat.

Stare aplicatie - Application State

Se memoreaza obiecte globale ce pot fi accesate de orice client.

Clasa de baza System.Web.HttpApplicationState ce este furnizata in toate paginile prin


intermediul obiectului Application.

O aplicatie ASP.NET este suma tuturor fisierelor, paginilor, handler-ilor, modulelor si codului
din cadrul unui director virtual si a subdirectoarelor de un singur server Web.

Se creaza o instanta, separata pentru fiecare aplicatie ASP.NET pe serverul Web.

Gestionarea starii aplicatiei este similara cu gestionarea sesiunii.

protected void Page_Load(Object sender, EventArgs e)


{
int count = 0;
if (Application["HitCounterForOrderPage"] != null)
count = (int)Application["HitCounterForOrderPage"];

count++;
Application["HitCounterForOrderPage"] = count;
lblCounter.Text = count.ToString();
}

sau cod mai bun:


protected void Page_Load(Object sender, EventArgs e)
{
// Acquire exclusive access.
Application.Lock();
int count = 0;
if (Application["HitCounterForOrderPage"] != null)
count = (int)Application["HitCounterForOrderPage"];

count++;
Application["HitCounterForOrderPage"] = count;
// Release exclusive access.
Application.UnLock();
lblCounter.Text = count.ToString();
}

Ioan Asiminoaei
ASP.NET – continuare 17/31 15.05.2013

Variabile statice ale aplicatiei


Sunt disponibile tutror paginilor, dar sunt definite in fisierul global.asax.

Exemplu (avem nevoie de o clasa unde sunt definite variabilele statice)

<%@ Application Language="C#" ClassName="Global" %>


// cod lipsa
public static string[] fileList;

si apoi la utilizare putem scrie

string firstEntry = Global.fileList[0];

O alta posibilitate este de a folosi proprietati statice.

private static string[] fileList;

public static string[] FileList


{
get { return fileList; }
}

Observatie
Nu sunt protejate la accesul concurent.

Ioan Asiminoaei
ASP.NET – continuare 18/31 15.05.2013

Data binding
Asociere sursa de date cu un control pentru a afisa in mod automat data.

Caracteristica principala este ca data binding este declarativa (definita in afara codului) si nu
programabila.

Exista urmatoarele situatii:


 asociere singulara – controale ce mentin o singura valoare (TextBox, LinkButton,
Image, etc.).
Proprietatea pe care o asociem nu e necesar sa aiba o reprezentare vizuala, de ex.
HyperLink.Text are o valoare iar HyperLink.NavigateUri o alta valoare care e asociata la
o sursa de date.
 asociere lista de valori.

Pentru a crea asocieri de valori singulare vom crea o expresie pentru binding.

Daca controlul suporta lista de valori (ListBox, etc.) acesta are o proprietate DataSource folosita
in binding.

Declararea asocierii (binding) este separata de actualizarea controlului.

Pentru actualizare control va trebui sa folosim metoda DataBind() ce itereaza sursa de date si
actualizeaza controlul.

Asociere valoare singulara


Se folosesc expresii care sunt plasate in .aspx incadrate de <%# expresie %>.

Exemplu. Pp ca avem o variabila in clasa derivata din Page, numita EmployeeName, atunci
putem scrie in .aspx:

<%# EmployeeName %>

Pentru a evalua expresia de mai sus trebuie sa apelam in cod metoda Page.DataBind().

Sursa pentru o valoare singulara poate fi : proprietate, variabila membru, valoare de retur dintr-o
functie sau orice expresie ce poate fi evaluata la runtime.

Exemplu

<%# GetUserName() %>


<%# 1 + (2 * 20) %>
<%# "John " + "Smith" %>
<%# Request.Browser.Browser %>

Un exemplu complet poate fi urmatorul

<html xmlns="http://www.w3.org/1999/xhtml">
<body>
<form method="post" runat="server">

Ioan Asiminoaei
ASP.NET – continuare 19/31 15.05.2013

<asp:Image ID="image1" runat="server"


ImageUrl='<%# FilePath %>' />
<br />
<asp:Label ID="label1" runat="server"
Text='<%# FilePath %>' />
<br />
<asp:TextBox ID="textBox1" runat="server"
Text='<%# GetFilePath() %>' />
<br />
<asp:HyperLink ID="hyperLink1" runat="server"
NavigateUrl='<%# LogoPath.Value %>' Font-Bold="True"
Text="Show logo" />
<br />
<input type="hidden" ID="LogoPath" runat="server"
value="apress.gif">
<b><%# FilePath %></b><br />
<img src="<%# GetFilePath() %>">
</form>
</body>
</html>

si metode implementate

protected string GetFilePath()


{
return "apress.gif";
}

protected string FilePath


{
get { return "apress.gif"; }
}

protected void Page_Load(object sender, System.EventArgs e)


{
// cod lipsa
this.DataBind();
}

Alte tipuri de expresii


<%$ expresie %>

reprezinta o secventa de cod pe care o adaugam in .aspx si care va fi evaluata cand pagina este
redata.

Nu e nevoie de DataBind().

Nu pot fi inserate oriunde in pagina ci intr-un control pentru a seta o proprietate a controlului.

Exemplu se ia valoarea din fisierul de configurare

<asp:Literal Runat="server" Text="<%$ AppSettings:appName %>" />

Ioan Asiminoaei
ASP.NET – continuare 20/31 15.05.2013

Asociere de lista de valori


Controale ce suporta liste de valori folosesc tag <select>, HtmlSelect, ListBox, DropDownList.
CheckBoxList , RadioButtonList si BulletedList

E necesar apelul DataBind() in cod.

Cand asociem date la aceste controale folosim proprietatile de mai jos.

DataSource – obiectul ce contine colectia de date (sursa). Acest obiect implementeaza in mod
normal interfata ICollection.

DataSourceID – in loc de a furniza data in mod programabil, putem lega controlul la o sursa de
date prin setarea acestei proprietati.

Observatie
DataSource si DataSourceID sunt exclusive.

DataTextField - Fiecare sursa de date reprezinta o colectie de articole. Un control de tip lista
afiseaza la un moment dat o singura valoare. DataTextField indica campul sau proprietatea ce va
fi afisata in pagina.

DataTextFormatString – specifica formatarea afisarii.

DataValueField – similar cu DataTextField, dar valoarea datei nu e afisata in pagina, este


memorata in atributul value al tag-ului HTML. Se memoreaza de obicei chei unice folosite apoi
in cadrul aplicatiei (regasire din baza de date, etc.).

Exemplu

protected void Page_Load(object sender, System.EventArgs e)


{
if (!Page.IsPostBack)
{
// Create the data source.
Hashtable ht = new Hashtable();
ht.Add("Lasagna", "Key1");
ht.Add("Spaghetti", "Key2");
ht.Add("Pizza", "Key3");

// Set the DataSource property for the controls.


Select1.DataSource = ht;
Select2.DataSource = ht;
Listbox1.DataSource = ht;
DropdownList1.DataSource = ht;
CheckList1.DataSource = ht;
OptionList1.DataSource = ht;

// Bind the controls.


this.DataBind();
}
}

Ioan Asiminoaei
ASP.NET – continuare 21/31 15.05.2013

Asociere la un DataReader
Exemplu

In .aspx avem declaratia:

<asp:ListBox runat="server" ID="lstNames" Rows="10" SelectionMode="Multiple"


DataTextField="FullName" DataValueField="EmployeeID"/>

so dorim sa asociem rezultatele urmatoare (date de fraza Sql Select)

SELECT EmployeeID, TitleOfCourtesy + ' ' +


FirstName + ' ' + LastName As FullName FROM Employees

Cand pagina e incarcata, se regasesc aceste informatii din bd si se asciaza la controlul declarat
astfel:

protected void Page_Load(object sender, EventArgs e)


{
if (!Page.IsPostBack)
{
// Create the Command and the Connection.
string connectionString = WebConfigurationManager.ConnectionStrings[
"Northwind"].ConnectionString;
string sql = "SELECT EmployeeID, TitleOfCourtesy + ' ' + " +
"FirstName + ' ' + LastName As FullName FROM Employees";
SqlConnection con = new SqlConnection(connectionString);
SqlCommand cmd = new SqlCommand(sql, con);
try
{
// Open the connection and get the DataReader.
con.Open();
SqlDataReader reader = cmd.ExecuteReader();

// Bind the DataReader to the list.


lstNames.DataSource = reader;
lstNames.DataBind();
reader.Close();
}
finally
{
// Close the connection.
con.Close();
}
}

Determinarea selectiei facuta de utilizator este data de codul urmator (se scaneaza intreaga
colectie si se testeaza proprietatea Selected):

protected void cmdGetSelection_Click(object sender, System.EventArgs e)


{
Result.Text += "<b>Selected employees:</b>";
foreach (ListItem li in lstNames.Items)
{
if (li.Selected)
Result.Text += String.Format("<li>({0})
{1}</li>", li.Value, li.Text);

Ioan Asiminoaei
ASP.NET – continuare 22/31 15.05.2013

}
}

Asocieri la controale de date avansate


GridView: suporta selectare, editare, sortare si paginare.

DetailsView: afiseaza o singura inregistrare la un moment dat.


Suporta editarea si eventual paginarea.

FormView: ca si DetailsView dar suporta editarea.


FormView este bazat pe template.

Un mic exemplu cu GridView

Pp. urmatoarea declaratie in .aspx:

<asp:GridView ID="grid" runat="server" AutoGenerateColumns="true" />

si ne propunem sa aducem din baza de date informatii astfel:

string sql = "SELECT EmployeeID, FirstName, LastName, Title, City " +


"FROM Employees";

Asociem GridView la DataReader astfel (este cod asemanator cu cel dintr-un exemplu de mai
sus) :

grid.DataSource = reader;
grid.DataBind();

Asociere la DataView
Deoarece DataReader este un cursor “numai inainte” (forward) nu il putem asocia la mai multe
controale.

Pentru a rezolva aceasta problema vom folosi modelul deconectat din ADO.NET.

Vom completa un DataSet, ce poate fi asociat la mai multe controale si putem de asemenea
gestiona sortarea articolelor mai usor.

Nu vom asocia in mod direct un DataSet sau DataTable ci un DataView. DataView reprezinta o
vizualizare a datelor dintr-o tabela specificata.

Astfel in loc de scrie in cod ceva de genul :

grid.DataSource = dataTable;
grid.DataBind();

vom scrie (ceea ce este echivalent)

grid.DataSource = dataTable.DefaultView;

Ioan Asiminoaei
ASP.NET – continuare 23/31 15.05.2013

grid.DataBind();

Controale surse de date


Controalele sursa de date includ orice control ce implementeaza interfata IDataSource.
Exista posibilitatea de a actualiza sursa de date cand se fac modificari in control.

Exista urmatoarele controale sursa de date in .NET :

SqlDataSource: - permite conectarea la orice sursa de date ce are un ADO.NET provider.

ObjectDataSource: permite conectarea la o clasa de date personalizata.

AccessDataSource: folosita in baza de date Access.

XmlDataSource: permite conectarea la un fisier XML.

SiteMapDataSource: permite conectarea la fisierul Web.sitemap ce descrie structura de


navigare a site-ului.

Ciclul de viata al paginii cu DataBinding

Asocierea datelor se face in urmatoarea ordine:

1. Pagina este creata (bazat pe fisierul .aspx).


2. Incepe ciclul de viata al paginii (Page.Init, Page.Load).
3. Se executa evenimente pe alte controale.
4. Controalele sursa de date executa orice update. Daca o inregistrare este in actualizare se
genereaza evenimentele Updating si Updated. Daca se insereaza o inregistrare se genreaza
evenimentele Inserting si Inserted. Daca o inregistrare este stearsa se genereaza
evenimentele Deleting si Deleted.
5. Evemimentul Page.PreRender.
6. Controalele sursa de date executa orice cerere si insereaza datele regasite in controalele
asociate. Se genereaza evenimentele Selecting si Selected in acest moment.
7. Pagina este construita, trimisa la client si apoi distrusa..

Procesul se repeta pentru fiecare cerere.

SqlDataSource – reprezinta conexiune la baza de date ce foloseste ADO.NET


In .aspx avem

<asp:SqlDataSource ID="SqlDataSource1" runat="server" ProviderName=”...” />

SqldataSource necesita o modalitate de a crea obiectele Connection, Command si DataReader.

Urmatorul pas e sa furnizam stringul de conectare.

<configuration>
<connectionStrings>

Ioan Asiminoaei
ASP.NET – continuare 24/31 15.05.2013

<add name="Northwind"
connectionString="Data Source=localhost;Initial
Catalog=Northwind;
Integrated Security=SSPI"/>
</connectionStrings>
...
</configuration>

iar in .aspx vom avea


<asp:SqlDataSource ConnectionString="<%$ ConnectionStrings:Northwind %>" ...
/>

SqldataSource contine proprietatile: SelectCommand, InsertCommand, UpdateCommand si


DeleteCommand ce au ca valoare un string ce corespunde unor comenzi SQL. Nu e obligatoriu
ca toate aceste proprietati sa fie completate.

Exemplu

<asp:SqlDataSource ID="sourceEmployees" runat="server"


ProviderName="System.Data.SqlClient"
ConnectionString="<%$ ConnectionStrings:Northwind %>" SelectCommand=
"SELECT EmployeeID, FirstName, LastName, Title, City FROM Employees"/>

Fraza Select din SQL poate contine parametri ce pot fi furnizati ca in exemplul urmator:
<asp:SqlDataSource ID="sourceEmployees" runat="server"
ProviderName="System.Data.SqlClient"
ConnectionString="<%$ ConnectionStrings:Northwind %>"
SelectCommand="SELECT EmployeeID, FirstName, LastName,
Title, City FROM Employees WHERE City=@City">
<SelectParameters>
<asp:ControlParameter ControlID="lstCities" Name="City"
PropertyName="SelectedValue" />
</SelectParameters>
</asp:SqlDataSource>

Parametrii sunt indicati folosind @.

Din exemplu se observa ca valoarea parametrului va fi preluata din lstCities.SelectedValue, ce


apartine controlului cu ControlID = “lstCities”.

Tipurile parametrului

Un parametru poate fi mapat la oricare din tipurile de parametri definiti mai jos.

Control sursa Tag Descriere


Proprietate control <asp:ControlParameter> Proprietate din alt control de
pe pagina.
Valoare din Query <asp:QueryStringParameter>
string
Valoare din Cookie <asp:CookieParameter> Cookie atasat la cerere

Ioan Asiminoaei
ASP.NET – continuare 25/31 15.05.2013

ObjectDataSource

ObjectDataSource permite de a crea o legatura declarativa intre controlalele din pagina si


componenta de acces la date ce poate executa cereri si actualizari ale datelor.

Clasa pe care o folosim trebuie sa respecte urmatoarele reguli :

 Toata logica trebuie sa fie continuta intr-o singura clasa.


 Trebuie sa furnizeze rezultatele cererii cand este apelata o singura metoda.
 Rezultatele cererii contin mai multe inregistrari ce pot fi reprezentate ca o colectie, un
array, un DataSet, DataTable, DataView sau o lista de obiecte ce implementeaza interfata
IEnumerable. Fiecare inregistrare ar trebui sa fie un obiect personalizat ce expune datele
sale prin proprietati publice.
 Se pot folosi metode ale instantei sau metode statice. Daca ce folosesc metode ale
instantei, clasa trebuie sa aiba un ctor fara parametri.
 Trebuie sa fie fara stare.

Selectare inregistrari

Consideram urmatorul exemplu.


public class EmployeeDB
{
public EmployeeDetails GetEmployee(int EmployeeID) { ... }
public List<EmployeeDetails> GetEmployees() { ... }
public int InsertEmployee(EmployeeDetails emp) { ... }
public void DeleteEmployee(int employeeID) { ... }
public void UpdateEmployee(int employeeID, string firstName,
string lastName, string titleOfCourtesy) {... }
public int CountEmployees() { ... }
}

Primul pas este de a defini ObjectDataSource si a indica numele clasei ce contine metodele de
acces la date. Se foloseste proprietatea TypeName.
<asp:ObjectDataSource ID="sourceEmployees" runat="server"
TypeName="DatabaseComponent.EmployeeDB" ... />

Urmatorul pas este de indica metoda ce actualizeaza datele.


ObjectDataSource defineste proprietatile SelectMethod, DeleteMethod, UpdateMethod, si
InsertMethod. Fiecare proprietate va fi actualizata cu numele metodei ce executa actiunea
dorita.
<asp:ObjectDataSource ID="sourceEmployees" runat="server"
TypeName="DatabaseComponent.EmployeeDB" SelectMethod="GetEmployees" />

Dupa ce am definit ObjectDataSource, putem asocia controalele din pagina la sursa de date ca
si la SqlDataSource.

<asp:ObjectDataSource ID="sourceEmployees" runat="server"


TypeName="DatabaseComponent.EmployeeDB" SelectMethod="GetEmployees"/>
<asp:ListBox ID="ListBox1" runat="server" DataSourceID="sourceEmployees"
DataTextField="EmployeeID"></asp:ListBox>
<br />

Ioan Asiminoaei
ASP.NET – continuare 26/31 15.05.2013

<asp:GridView ID="GridView1" runat="server" DataSourceID="sourceEmployees">


</asp:GridView>

Observatie
Ordinea coloanelor este data de ordinea de definire a proprietatilor in clasa.

Folosire constructori cu parametri

Se poate extinde ObjectDataSource pentru a lucra cu constructori cu parametri. Pentru aceasta


trebuie tratat evenimentul ObjectDataSource.ObjectCreating.

Exemplu

private string connectionString;


public EmployeeDB()
{
connectionString =
WebConfigurationManager.ConnectionStrings["Northwind"].ConnectionString
;
}

public EmployeeDB(string connectionString)


{
this.connectionString = connectionString;
}

protected void sourceEmployees_ObjectCreating(object sender,


ObjectDataSourceEventArgs e)
{
e.ObjectInstance = new DatabaseComponent.EmployeeDB("...");
}

Observatie
Se pot folosi metode cu parametri, tehnica fiind aceeasi ca la SqlDataSource.

Ioan Asiminoaei
ASP.NET – continuare 27/31 15.05.2013

Controale de date avansate


Evolutia controalelor in ASP.NET

 DataGrid: introdus in ASP.NET 1.1 inlocuit de GridView in 2.0.

 DataList: introdus in ASP.NET 1.0 inlocuit de GridView ASP.NET 2.0


 DataList are posinbilitatea de a crea o tabela cu mai multe coloane unde fiecare celula
este o inregistrare. GridBView nu are aceasta facilitate dar poate fi folosit ListView.

 Repeater: introdus in ASP.NET 1.0. inlocuit de ListView.

 GridView: introdus in ASP.NET 2.0 si ramas neschimbat in ASP.NET 3.5.

 ListView: ASP.NET 3.5

 DetailsView: afisare data pentru o singura inregistrare, ASP.NET 2.0 / ASP.NET 3.5.

 FormView: permite afisarea datelor intr-o forma netabelata.


ASP.NET 2.0 / ASP.NET 3.5.

Nu vom studia aceste controale. Tema la laborator si la proiect.

Ioan Asiminoaei
ASP.NET – continuare 28/31 15.05.2013

Themes si Master Page


Themes permit de a defini detalii de formatare pentru controale si de a le folosi in pagini
multiple.

Master page – permite crearea de template-uri de pagini reutilizabile. Se defineste layout-ul


pentru paginile din site web, astfel incat fiecare pagina ce va utiliza master page va avea acelasi
aspect in cadrul site-ului web.

CSS - Cascading Style Sheets


Putem defini stiluri pentru a le aplica, prin intermediul proprietatii CssClass, la diverse
controale.
Se definesc odata si se folosesc ori de cate ori avem nevoie.

Exemplu

.heading1
{
font-weight: bold;
font-size: large;
color: lime;
font-family: Verdana, Arial, Sans-Serif;
}

Din mediul de dezvoltare se adauga un articol nou de forma Stylesheet in care se definesc
stilurile. Acest fisier de stiluri se adauga apoi la fiecare pagina unde dorim sa le aplicam
controalelor din pagina.

Stilurile pot fi create din mediul de dezvoltare.

Aplicarea stilurilor
Va trebui sa introducem un link (in pagina) catre fisierul de stiluri.
Acest link se adauga in sectiunea <head> a paginii.

<link href="StyleSheet.css" rel="stylesheet" type="text/css" />

iar folosirea stilurior in controale se face prin setarea proprietatii CssClass.

<asp:Label ID="Label1" runat="server" Text="This Label uses the heading1


style." CssClass="heading1"></asp:Label>

Pentru HTML se foloseste proprietatea class.

<div class="blockText" id="paragraph" runat="server" >


<p>This paragraph uses the blockText style.</p>
</div>

Ioan Asiminoaei
ASP.NET – continuare 29/31 15.05.2013

Themes
CSS sunt limitate la o multime fixa de atribute pentru stil. De exemplu CSS nu poate controla
modul de organizare al articolelor dintr-un control de tip list (contine o multime de articole).

Themes fac acest lucru posibil.

Themes nu inlocuiesc CSS.

Themes sunt bazate pe controale nu pe HTML.


Themes sunt aplicate pe server.
Themes pot fi aplicate prin fisierele de configurare.

Theme Folders si Skins


Toate temele sunt specifice aplicatiei.
Trebuie sa acream un folder App_Themes, ce contine temele.
O aplicatie poate contine definitii pentru teme multiple atata timp cat acestea sunt in foldere
diferite.
O pagina poate avea o singura tema la un moment dat.

Pentru ca temele « sa faca ceva », trebuie sa cream un fisier « skin » in folderul pentru teme.
Un fisier « skin » este un fisier text cu extensia .skin si contine o lista de tag-uri de controale,
tag-uri ce nu definesc in mod complet un control ci vor seta numai proprietatile pe care dorim sa
le standardizam.

Exemplu pentru ListBox

<asp:ListBox runat="server" ForeColor="White" BackColor="Orange"/>

runat=”server” este obligatoriu, atributul ID nu este permis.

Fiecare tema poate contine unul sau mai multe fisiere skin.

Aplicarea unei teme simple

Adaugarea unei teme la proiect : Project->Add New Item si selectam Skin File.

Exemplu de theme

<asp:ListBox runat="server" ForeColor="White" BackColor="Orange"/>


<asp:TextBox runat="server" ForeColor="White" BackColor="Orange"/>
<asp:Button runat="server" ForeColor="White" BackColor="Orange"/>

Pentru a aplica aceste teme la pagina web trebuie sa setam atributul Theme (in directiva paginii)
cu numele fisierului .skin.

<%@ Page Language="C#" AutoEventWireup="true" ... Theme="FunkyTheme" %>

Ioan Asiminoaei
ASP.NET – continuare 30/31 15.05.2013

Observatie
Conflictul ce poate aparea intre CSS si Theme poate fi rezolvat astfel:

<%@ Page Language="C#" AutoEventWireup="true" ...


StyleSheetTheme="FunkyTheme" %>

folosind proprietatea StyleSheetTheme ceea ce inseamna ca CSS se va aplica si nu Theme. Daca


nu se specifica acest lucru atunci se aplica Theme totdeauana cand exista un conflict.

Skins-uri multiple pentru acelasi control


In acest caz se foloseste proprietatea SkinID cand se defineste skin si apoi aceasta se referentiaza
in cadrul controlului.

In skin avem :

<asp:ListBox runat="server" ForeColor="White" BackColor="Orange" />


<asp:TextBox runat="server" ForeColor="White" BackColor="Orange" />
<asp:Button runat="server" ForeColor="White" BackColor="Orange" />
<asp:TextBox runat="server" ForeColor="White" BackColor="DarkOrange"
Font-Bold="True" SkinID="Dramatic" />
<asp:Button runat="server" ForeColor="White" BackColor="DarkOrange"
Font-Bold="True" SkinID="Dramatic" />

in definitia controlului :

<asp:Button ID="Button1" runat="server" ... SkinID="Dramatic" />

Ioan Asiminoaei
ASP.NET – continuare 31/31 15.05.2013

Standardizarea layout-ului unui Website


Modalitati
 User control
 HTML frame:
 Master page:

Master page sunt template-uri pentru pagini web ce pot defini un continut fix si declara portiunea
unde paginile web pot insera continut personalizat.

ASP.NET defineste doua tipuri specializate de pagini:


 master page si
 pagini de continut.

Master page este o pagina template ce poate contine combinatii de HTML, controale web si chiar
cod. Mai mult, master page potate include anumite regiuni definite (au un identificator) ce pot fi
apoi modificate.

Fiecare pagina de continut referentiaza o singura pagina master page.

Ioan Asiminoaei

S-ar putea să vă placă și