19 noiembrie 2009

web.config

web.config este un fişier XML ce se află în directorul aplicaţiei ASP .NET şi care conţine diverse elemente de configurare a aplicaţiei. Structura fişierului începe cu tag-ul <configuration> iar în interiorul acestuia avem secţiunea <system.web> unde se află partea de configurare a aplicaţiei precum şi secţiunea <appSettings> unde putem să introducem elemente personalizate de configurare.

Ca toate fişierele XML, şi web.config este case-sensitive (tagurile cu acelaşi nume şi litere mici sunt diferite faţă de cele cu litere mari şi acelaşi nume). web.config se află în directorul rădăcină, dar fiecare subdirector al aplicaţiei poate conţine un fişier web.config cu setări adiţionale ce se aplică acelor subdirectoare. De exemplu, putem crea un fişier pentru subdirectorul administrare al aplicaţiei în care să nu permitem accesul persoanelor neautorizate.

Printre cele mai uzuale setări ale fişierului web.config se numără următoarele:

  • Conectarea la baza de date. Să presupunem că avem 20 pagini într-o aplicaţie ASP. NET, fiecare din ele utilizând o conexiune la baza de date. Putem defini o conexiune la baza de date în fişierul web.config care să poată fi folosită în toate paginile. Astfel, dacă modificăm conexiunea, o facem doar într-un singur loc.

    Pentru a defini o conexiune la baza de date în fişierul web.config, folosim următorul cod introdus în secţiunea <configuration> dar înaintea secţiunii <system.web>:

    <connectionStrings>
    <add name="nume_conexiune" connectionString="Data Source=nume_calculator/nume_server_sql;Initial Catalog=nume_baza_de_date;Persist Security Info=True;User ID=user;Password=parola;"
    providerName="System.Data.SqlClient" />
    </connectionStrings>

    Codul de mai sus poate fi folosit în cazul când conexiunea la serverul SQL se realizează folosind autentificarea SQL Server. Dacă se foloseşte autentificarea Windows atunci connectionString se înlocuieşte cu:

    connectionString="Data Source=nume_calculator/nume_server_sql;Initial Catalog=nume_baza_date;Integrated Security=True"

    Pentru a folosi conexiunea în partea de server side a unei pagini folosim următorul cod:

    private string connectionstring = WebConfigurationManager.ConnectionStrings["nume_conexiune"].ConnectionString;


  • Erori personalizate. La întâlnirea unei erori în aplicaţie putem seta ca ASP .NET să redirecţioneze utilizatorul spre o anumită pagină. Următorul cod se poate introduce în web.config în secţiunea system.web:

    <customErrors defaultRedirect="pagina.aspx"/>

    Folosind codul de mai sus, la întâlnirea oricărei erori, ASP .NET va redirecţiona utilizatorul spre pagina.aspx. Putem personaliza şi mai mult paginile la care ajunge utilizatorul în caz de eroare folosind codurile erorilor. De exemplu, 404 este eroarea pentru pagină negăsită, iar 403 este eroarea pentru acces interzis. Putem scrie astfel:

    <customErrors defaultRedirect="pagina.aspx">
    <error> statusCode="404" redirect="eroare404.aspx" />
    <error> statusCode="403" redirect="eroare403.aspx" />
    <customErrors>

    În acest caz, dacă se întâlneşte eroarea pagină negăsită, utilizatorul va fi redirecţionat spre eroare404.aspx, dacă accesul este interzis, utilizatorul va vedea pagina eroare403.aspx, iar în cazul oricărei alte erori se va afişa pagina pagina.aspx

  • Mărimea fişierelor încărcate pe server. Implicit, când facem un upload, ASP .NET respinge fişierele mai mari de 4 MB. Pentru a modifica această limitare, putem introduce în fişierul web.config următoarea linie de cod în secţiunea <system.web>

    <httpRuntime maxRequestLength = "10240" />

    În cazul de mai sus, dimensiunea maximă a fişierului acceptat de server este de 10 MB.

  • Interzicerea accesului în anumite directoare. Interzicerea accesului se poate face foarte simplu folosind tag-ul authorization în secţiunea system.web astfel:

    <authorization>
    <deny users = "?" />
    <authorization>

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.