29 ianuarie 2009

Cookies





Cu ajutorul unui cookie (nu biscuit sau prăjitură) putem reţine şi folosi anumite date în toate paginile aplicaţiei web. Cookie-urile sunt create pe calculatorul clientului şi nu sunt folosite pentru a stoca date de o dimensiune prea mare. Putem folosi un cookie pentru a stoca de exemplu numele utilizatorului autentificat sau email-ul acestuia.

Un cookie se crează astfel:


HttpCookie cookie = new HttpCookie("date");

cookie["nume"] = nume.Text;

cookie["email"] = email.Text;

Response.Cookies.Add(cookie);



Acest cookie va fi valabil până când browserul rămâne deschis. Dacă vrem să prelungim valabilitatea unui cookie, scriem astfel:


cookie.Expires = DateTime.Now.AddYears(100); // acest cookie e valabil 100 ani


Putem prelua datele din cookie astfel:


string c="";

HttpCookie cookie = Request.Cookies["date"];

if (cookie != null) // verificam daca cookie-ul exista
{
c = "nume: " + (string)cookie["nume"] + " şi email:" + (string)cookie["email"];
}


Singura modalitate de a şterge un cookie este de a-i seta o dată de expirare înainte de data curentă. Codul este:


HttpCookie cookie = Request.Cookies["date"];

cookie.Expires = DateTime.Now.AddDays(-1);

Response.Cookies.Add(cookie);


Descarcă exemplul

28 ianuarie 2009

Redirectionare si trimiterea informatiilor intre pagini folosind query string






Redirecţionarea către o altă pagină se face folosind instrucţiunea Response.Redirect()


Response.Redirect("default2.aspx?luna="+
DropDownList1.SelectedItem.Value);


Browserul va fi redirecţionat către pagina default2.aspx. ?luna=valoare reprezintă parametrul transmis paginii. Numele parametrului este luna deoarece se află după semnul "?" care denotă începerea parametrilor. Pentru mai mulţi parametri putem scrie ?luna=valoare&anul=valoare

În pagina a 2-a putem prelua valoarea parametrului trimis folosind Request.QueryString[] astfel:


Label1.Text="Luna aleasă este <strong>" + Request.QueryString["luna"].ToString()+"</strong>";


Avantaje: simplu şi rapid.
Dezavantajele: utilizatorii avansaţi pot modifica valorile parametrilor care sunt vizibile şi nu se pot trimite valori mari.

Descarcă acest exemplu

Disable la un buton dupa click

M-am întâlnit cu următoarea situaţie: după completarea datelor unui form, datorită conexiunii la internet lente, utilizatorii grăbiţi au apăsat de mai multe ori butonul de adăugare a datelor din form astfel datele au fost duplicate.

Buton pe disable şi trimiterea datelor spre server.

Vom folosi javascript pentru această operaţie. Codul javascript este următorul:


<script type="text/javascript" language="javascript">
function disable_buton() {

document.getElementById("trimite_date").disabled = "disabled";
document.getElementById("trimite_date").value = "Aşteaptă...";
__doPostBack("trimite_date", "OnClick");

}
</script>


Iar codul HMTL este



<div style="width:300px;float:left;border-style:solid;border-color:Black;border-width:1px;padding:10px;">

Nume: <asp:TextBox ID="nume" runat="server"></asp:TextBox><br />
Vârstă: <asp:TextBox ID="varsta" runat="server" Width="30px"></asp:TextBox><br />
Ocupaţie: <asp:TextBox ID="ocupatie" runat="server"></asp:TextBox><br /><br />

<asp:Button ID="trimite_date" runat="server" Text="Apasă butonul"
onclick="trimite_date_Click" UseSubmitBehavior="False" OnClientClick="disable_buton();" />

<br />
<br />
<asp:Label ID="Label1" runat="server" ForeColor="#999999" Text="Rezultat..."></asp:Label>

</div>




În codul javascript, butonul cu id-ul "trimite date" este pus pe disable, este schimbat text-ul apoi este executată funcţia __dopostback() (cu două semne "_" in faţa numelui). Această funcţie este responsabilă cu trimiterea datelor spre server. Acceptă 2 parametri, primul este id-ul controlului care a iniţiat trimiterea datelor, iar al 2-lea reprezintă o informaţie suplimentară cum ar fi tipul evenimentului asociat controlului.

În codul HTML butonul "trimite_date" are setat atributul UseSubmitBehavior="False" lucru important pentru funcţionarea bună a script-ului.

În cazul unei erori de validare în directiva page se setează atributul EnableEventValidation="false"


<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" EnableEventValidation="false" %>


Descarcă acest exemplu

Upload fisiere. Upload dinamic

ASP .NET include un control cu ajutorul căruia putem încărca fişiere pe server. Acesta este FileUpload. FileUpload este echivalentul HTML pentru <input type="file">



Pentru a putea încărca un fişier pe server, adăugăm în pagină un control FileUpload şi un buton



În pagina aspx avem următorul cod:



<div class="div_upload_fisier" >
<h2>Upload un singur fişier</h2>
<em>Alegeţi fişierul</em>:
<asp:FileUpload ID="fisier_1_0" runat="server" />
<br />
<br />
<asp:Button ID="Button1" runat="server" Text="Încarcă fişier"
onclick="Button1_Click" />

</div>



Utilizatorul va alege fişierul printr-un click pe browse. După alegerea fişierului pentru upload, la click pe buton, pagina va trimite datele spre server. Metoda PostedFile.SaveAs a unui control FileUpload salveaza fisierul pe disc. Sintaxa pentru un control cu id-ul FileUpload1 este:

FileUpload1.PostedFile.SaveAs("cale_completă_fişier");

Codul C# pentru exemplul aspx de mai sus este următorul:


fisier_1_0.PostedFile.SaveAs(Request.PhysicalApplicationPath + Path.GetFileName(fisier_1_0.PostedFile.FileName));


Metoda SaveAs() trebuie să primească ca parametru un string ce reprezintă calea către fişier + numele fişierului. În cazul de mai sus, Request.PhysicalApplicationPath returnează calea fizică curentă a apicaţiei web, iar Path.GetFileName() returnează numele fişierului ales de utilizator pentru upload. fisier_1_0.PostedFile.FileName conţine calea+numele original al fişierului.

Clasa Path necesită folosirea namespace-ului System.IO. Putem scrie using System.IO sau să procedăm ca în imaginea de mai jos (click dreapta pe cuvântul Path)



Upload dinamic

Pentru a putea face un upload dinamic (adică să lăsăm utilizatorul să aleagă câte fişiere vrea) avem nevoie de puţin javascript.



Codul javascript este următorul (în partea de HEAD)


<script language="javascript" type="text/javascript">
var j=0;
function adauga_doc() {
j++;

var a = document.createElement('input');
var b = document.createElement('br');
a.setAttribute('type', 'file');
a.setAttribute('id', 'fisier_2_' + j);
a.setAttribute('name', 'fisier_2_' + j);

document.getElementById('adauga_documente_div').appendChild
(a);
document.getElementById('adauga_documente_div').appendChild
(b);
}
</script>


Funcţia adauga_doc() va adăuga un control <input type="file"> pentru upload-ul fişierelor. În mod normal acest control necesită ca tag-ul <form> să conţină atributul enctype="multipart/form-data" dar deoarece avem un control FileUpload pe pagină, acel atribut este creat automat de ASP .NET. Se crează elementul input de tip file cu id-ul şi numele unic (prin incrementarea variabilei j) ori de câte ori utilizatorul apasă pe link-ul "încă un fişier". În acest fel vom avea controale cu id şi nume unic pentru a nu exista probleme la încărcare.

În secţiunea body avem următorul cod HTML


<div class="div_upload_dinamic">
<h2>Upload dinamic</h2>
<em>Alegeţi un fişier</em>:
<asp:FileUpload ID="fisier_2_0" runat="server" />
<div id="adauga_documente_div" runat="server"></div>
<a onclick="adauga_doc();" style="cursor:pointer;color:Blue;text-decoration:underline;">Încă un fişier</a><br /><br />

<asp:Button ID="Button2" runat="server" Text="Încarcă fişierele"
onclick="Button2_Click" />
<br />
</div>


Observăm că la elementul <a> avem atributul onclick ce execută funcţia adauga_doc()

Codul C# pentru salvarea fişierelor pe server este următorul:


string nume_fisier;
for (int j = 0; j < Request.Files.Count; j++)
{

if (Request.Files[j].ContentLength > 0)
{
nume_fisier = Path.GetFileName(Request.Files[j].FileName);
Request.Files[j].SaveAs(Request.PhysicalApplicationPath.ToString
() + nume_fisier);
}
}


Request.Files reprezintă colecţia de fişiere încărcate. Parcurgem fişierele încărcate şi le salvăm rând pe rând pe server.

Descărcaţi acest exemplu



Limitarea dimensiunii fişierelor încărcate

Putem modifica dimensiunea maximă pe care o poate accepta ASP .NET la upload-ul fişierelor (implicit e 4 mega bytes). În fişierul web.config căutăm tag-ul <system.web> şi adăugăm următoarea linie

<httpRuntime maxRequestLength="10240"/>

10240 reprezintă 10 mega. Putem modifica valoarea în kilobytes a maxRequestLength.

27 ianuarie 2009

Structura unei aplicatii web in ASP .NET

Într-o aplicaţie web realizată cu ASP .NET vom avea următoarele tipuri de fişiere şi directoare importante

Fişiere cu extensia .aspx reprezintă locul unde este stocat conţinutul paginii web. Se pot adăuga elemente HMTL, javascript, controale ASP .NET server-side.

Fişierele cu extensia .cs reprezintă codul ce se va executa pe server. Se poate scrie cod C# sau Visual Basic. Se pot defini variabile, funcţii, clase, etc.

Fişierul web.config este un fişier de configurare unde este stocată informaţia referitoare la aplicaţia web. În acest fişier se pot defini mai multe proprietăţi ale aplicaţiei. De exemplu, putem defini string-ul de conectare la baza de date pentru a-l putea folosi in orice pagină, sau putem modifica limita mărimii fişierelor upload-ate.

Fişierul Global.asax este opţional şi se poate folosi pentru a manipula anumite evenimente cum ar fi Application_Start, Application_End, Session_Start, Session_End

Directorul BIN este folosit pentru a stoca diverse fişiere dll folosite ca şi componente sau controale în aplicaţie.

Directorul App_Code conţine cod ce se va compila şi va fi vizibil în orice pagină a aplicaţiei web. Se pot stoca aici de exemplu diverse clase.

Directorul App_Data conţine fişiere mdf specifice bazelor de date SQL sau Access.