Un jQuery UI și .Net Image Organizer

În cursul acestui tutorial vom examina modul de creare a unui simplu organizator de imagini care permite utilizatorilor să rearanjeze o serie de imagini; această funcționalitate ar putea fi utilă pentru orice tip de site bazat pe imagini în care utilizatorii au o colecție de imagini pe care le-au încărcat sau le-au adăugat în alt mod în profilul sau contul lor. Vom folosi .net pentru a prelua și a stoca ordinea imaginilor într-o bază de date SQL pe server și jQuery UI pentru a gestiona reordonarea imaginilor de pe client.


Noțiuni de bază

Pagina creată va fi de tip aSPX; putem crea și edita aceste fișiere cu un editor de text simplu, dacă este necesar, dar este mult mai eficient să folosim un IDE adecvat .Net. Visual Web Developer Express de la Microsoft este un IDE excelent .NET și este complet gratuit; apuca o copie acum de la http://www.microsoft.com/express/Web/. Acesta poate fi descărcat ca parte a Platformei Web; puteți alege o gamă de produse diferite atunci când le descărcați, în scopul acestui tutorial vom folosi următoarele componente:

  • Visual Web Developer Express 2008
  • SQL Server Express 2008 (cu SQL Server 2008 Management Studio Express)

Platforma Web este, de fapt, destul de bună și vă oferă acces la o gamă largă de aplicații și cadre web populare, cum ar fi dotNetNuke, Joomla, Umbraco și multe altele, iar platforma de instalare descarcă și configurează tot ce aveți nevoie. Va dura puțin timp să descărcați și să instalați, așa că, în timp ce face acest lucru, putem crea o zonă de dezvoltare; creați un dosar nou și apelați-l image_organiser, apoi în interiorul acestui dosar creați două foldere noi și apelați-le js și css.

De asemenea, trebuie să luați o copie a ultimei versiuni a jQuery UI; mergeți la constructorul de descărcări de la http://jqueryui.com/download și asigurați-vă că următoarele componente din stânga paginii sunt verificate:

  • miez
  • Widget
  • Șoarece
  • Sortable

Nu este necesară o temă, dar asigurați-vă versiunea 1.8 este selectat în partea dreaptă a paginii și apoi apăsați butonul de descărcare. Odată ce arhiva a fost descărcată, deschideți-o și copiați următoarele fișiere din js folder din arhiva la js dosarul pe care l-am creat:

  • 1.4.2.min.js-jQuery
  • jquery-ui-1.8.custom.min.js

De asemenea, folosim utilitatea excelentă JSON a lui Doug Crockford, care poate fi descărcată de la http://www.JSON.org/json2.js. Salvați o copie a acestui fișier la adresa noastră js folder și asigurați-vă că eliminați alerta din partea de sus a fișierului.

Odată ce programul de instalare a platformei a terminat, lansați Visual Web Developer Express și accesați Fişier " Deschideți site-ul web și apoi alegeți image_organiser dosar de proiect pe care tocmai l-am creat. Veți primi o întrebare dacă doriți să faceți upgrade site-ului pentru a utiliza .net 3.5; alege da.


Crearea unei baze de date

Vom crea o nouă bază de date și un tabel pentru acest exemplu; deschideți SQL Server Management Studio și conectați-vă la instanța locală a SQL Server (se va numi ceva asemănător COMPUTERNAME \ SQLEXPRESS). Pentru a crea o nouă bază de date, faceți clic dreapta pe Baze de date dosarul și alegeți Noua bază de date. În dialogul care apare setat numele bazei de date la image_organiser apoi faceți clic pe O.K. Ar trebui să vedeți noua bază de date listată în panoul din stânga al managerului.

Acum trebuie să creați o nouă tabelă în noua noastră bază de date; extinde noua bază de date, apoi faceți clic dreapta pe Mese dosarul și alegeți Tabelul nou. Consola de administrare vă va oferi câteva panouri suplimentare; unul care prezintă coloanele tabelului și una care arată proprietățile tabelului. Adăugați trei coloane în tabel, prima ar trebui să aibă numele src și să fie de tip varchar (50), al doilea ar trebui să aibă numele Alt și de asemenea să fie de tip varchar (50). Coloana finală este apelată [Ordin] și este de tip int. Doar Alt coloana ar trebui să permită nul valorile.

Faceți clic pe pictograma disc din bara de instrumente și alegeți numele imagini. Când extindeți Mese dosar în Object Explorer în stânga, ar trebui să apară noua tabelă. Într-o implementare completă, fiecare utilizator al aplicației ar avea propriul set de imagini și ar exista fără îndoială alte tabele din baza de date pentru nume de utilizator și parole și alte informații asociate cu utilizatorul. În scopul acestui tutorial, imaginați-vă că suntem un singur utilizator autentificat care manipulează propriul set de imagini.

Acum trebuie să populam masa cu unele date; faceți clic dreapta pe noua masă și alegeți Editați primele 200 de rânduri; consolă se va schimba din nou, astfel încât să aveți o vizualizare editabilă a tabelului. Un id coloana este introdusă automat în tabel; în acest exemplu, am folosit pur și simplu un număr de index indice zero pentru valorile din această coloană, dar acest lucru ar trebui să se potrivească cu numele fișierelor imaginilor în uz. Utilizați datele afișate aici:


Fișierul aspx

Pentru a crea o nouă pagină aspx, faceți clic dreapta pe rădăcina site-ului în Soluție Explorer la dreapta cererii și alegeți Adăugați un element nou. În caseta de dialog care apare alegeți Formularul Web în secțiunea de sus și Visual C # în Limba selectați caseta. Clic Adăuga.

Aceasta va da o nouă pagină numită default.aspx, care se va deschide automat în IDE. Noua pagină este listată în Soluție Explorer la dreapta și are o pictogramă plus lângă ea indicând faptul că conține ceva. Pentru cei dintre voi care nu au lucrat niciodată cu .Net înainte, conține codul din spate aspx.cs fișier pe care îl putem folosi pentru a adăuga logica server-ului pentru pagină mai târziu.

Fișierul aspx va avea deja câteva elemente în el, inclusiv a

; adăugați următorul cod în element:

Organizator de imagini

Re-comandați imaginile tragând o imagine într-o locație nouă. Modificările dvs. vor fi salvate automat.

Avem un simplu container exterior cu două

elementele din interiorul acestuia; una conține câteva instrucțiuni scurte, în timp ce cealaltă va fi utilizată pentru a ține elementele de imagine alese. Pentru a popula containerul de imagini cu imaginile din baza de date putem folosi controlul .Net Repeater la îndemână; adăugați următorul cod în interiorul containerului de imagini:

  „> "alt ="<%# DataBinder.Eval(Container.DataItem, "alt") %>"/>   

Noi folosim element whichrepeater control pe care tocmai l-am adăugat la pagină. Când deschideți Default.aspx.cs fișier veți vedea că există deja mai multe elemente în fișier; există o serie de utilizând direcțiile din partea de sus a fișierului care indică serverului spațiile de nume ale componentelor .Net care sunt cerute de fișierul aspx. Pe lângă cele incluse în fișier, va trebui să adăugăm și următoarele:

utilizând System.Data; utilizând System.Data.SqlClient;

După aceasta avem o definiție de clasă și o Page_Load manipulator de evenimente pe care îl putem folosi pentru a executa codul de pe server atunci când se încarcă pagina aspx. În acest handler de evenimente adăugați următorul cod:

// defini conexiunea SqlConnection dbCon = nou SqlConnection ("Server = DESKTOP \\ SQLEXPRESS; UID = sa; PWD = your_password; Database = image_organiser"); // definiți șirul de interogare sSQL = "Selectați * din imagini"; // definiți comanda SqlCommand cmd = nou SqlCommand (sSQL, dbCon); // deschide conexiunea dbCon.Open (); // citiți datele SqlDataReader ds = cmd.ExecuteReader (); // legați la repetor imageRepeat.DataSource = ds; imageRepeat.DataBind () // închide conexiunea dbCon.Close ();

Codul este foarte direct înainte, să mergem prin el; definim un nou SqlConnection folosind variabila dbCon. Valoarea acestei variabile este șirul de conexiune pe care îl folosim pentru conectarea la baza de date și constă din numele serverului, numele de utilizator (SA este implicit), parola și numele bazei de date. Nu uitați să le înlocuiți parola Dvs în codul de mai sus cu parola pe care o setați la instalarea SQL.

Apoi definim interogarea noastră, care în acest caz este doar pentru a selecta totul în baza de date folosind * wildcard. De asemenea, stocăm SqlCommand într-o variabilă care constă din interogare și conexiune. După aceasta, putem deschide conexiunea cu Deschis() și citiți datele într-un SqlDataReader variabilă cu ExecuteReader () metoda solicitat pe SqlCommand.

În cele din urmă, legăm datele la controlul repetorului prin setarea ds variabilă ca repetorul Sursă de date și apelarea DataBind () pe aceasta, înainte de a închide în cele din urmă conexiunea bazei de date. Nu este nevoie să selectăm controlul repetorului, putem să îl referim direct la el folosind ID-ul am specificat în pagina aspx. Prima etapă a codului nostru este acum completă, repetorul va afișa un

  • și pentru fiecare rând din baza noastră de date. În acest moment va arăta puțin blandă, deci să adăugăm un stil de bază.


    Modelarea paginii

    Pentru a adăuga o foaie de stil nouă site-ului, faceți clic dreapta pe css dosar în Soluție Explorer la dreapta și alege Adăugați un element nou; Selectați Foaia de stil în panoul de sus al dialogului și setați Nume domeniu la image_organiser.css, apoi lovit Adăuga. Fișierul nou se va deschide automat în IDE; adăugați următorul cod:

    #outerWrap width: 1004px; margin: auto; Poziția: relativă; culoare de fundal: #eee; frontieră: 1px solid # 999;  #outerWrap: după content: "."; display: block; vizibilitate: ascunse; clar: ambele;  h1 font: italic normal 24px Georgia, Serif; text-align: center; margine: 10px 0;  p margine: 0; font: 12px Arial, Sans-serif; umplutură: 0 10px;  #left width: 218px; plutește la stânga;  #images margin: 0; padding: 0; plutește la stânga; lățime: 786px;  #images li list-style-type: none; plutește la stânga; cursor: muta; margine: 10px 10px 0 0; lățime: 250px; height: 250px; frontieră: 1px solid # 999;  #images .vacant border: 3px punctat # 66d164; lățime: 246px; height: 246px; culoare de fundal: #fff; . succes, .failure marja: 0 0 0 10px; umplutura: 4px 0 4px 26px; Poziția: absolută; bottom: 18px; font-weight: bold;  .success background: url ('... /img/tick.png') nr-repeta 0 1px; Culoare: # 12751c;  .failure fundal: url ('... /img/cross.png') no-repeat 0 0; Culoare: # 861b16; 

    Aceste stiluri de bază, pur și simplu, plasează pagina în formatul dorit pentru acest exemplu. Nu este nimic important aici, oricare dintre ele ar putea fi ușor schimbat pentru a se potrivi altor cerințe. Nu uitați să vă conectați la noua foaie de stil din a paginii cu următoarele:

    În acest moment, pagina ar trebui să apară astfel în momentul în care se încarcă pentru prima dată în browser:

    Puteți vizualiza pagina făcând clic dreapta pe fișierul aspx din Soluție Explorer și alegerea Vizualizați în browser. Acest lucru va utiliza serverul web integrat al IDE pentru a afișa pagina.


    Prelucrarea imaginilor

    Punctul către pagină este de a face imaginile să fie ordonate astfel încât utilizatorul să le poată reordona, pentru a face acest lucru trebuie să ne conectăm la fișierele UI jQuery din folderul nostru js; adăugați următoarele

    Realizarea imaginilor este extrem de ușoară; după cele de mai sus

    Tot ce facem este să sunăm Sortable () metoda de pe container a elementelor pe care dorim să le putem sorta. Furnizăm un obiect de configurare metodei care specifică numele clasei care ar trebui aplicat în slotul gol în care elementul care este sortat poate fi introdus utilizând înlocuitor și o funcție de apel invers care ar trebui să fie executată ori de câte ori are loc un fel și se schimbă ordinea elementelor. Atunci când rulam pagina în acest moment, ar trebui să constatăm că imaginile sunt alese și că noi vacant sunt aplicate stiluri:


    Salvarea ordinii noi

    Tot ceea ce trebuie să facem acum în fișierul .aspx principal este trimiterea ordinii noi a imaginilor la server ori de câte ori imaginile sunt sortate; înlocuiți comentariul în Actualizați inversă cu următorul cod:

    // crează vars var orderArray = [], wrap = ; // reinițializați mesajul "salvat" $ (". succes", $ ("# left")) remove (); // procesează fiecare imagine $ ("# images img") fiecare (funcția (i) // construi img obiect var imgObj = "id": $ (this). împărțiți ("_") [1], "comanda": i + 1; // adăugați obiect la array orderArray.push (imgObj);); // înfășurați în obiect wrap.d = orderArray; // treci la server $ .ajax (tip: "POST", url: "WebService.asmx / updateOrder", date: JSON.stringify (wrap), contentType: "application / json; charset = utf-8" : funcția (date) if (data.d === "salvat") $ ("

    ") .text (" Noua ordine salvată! ") .addClass (" succes ") appendTo (" # left "

    ") .text (" Salvați eșuat ") .addClass (" eșec "). appendTo (" # left "););

    Să ne uităm la ceea ce face acest cod; mai întâi vom crea câteva variabile pe care le vom avea nevoie mai târziu în scenariu, primul este un literar matriceal, al doilea obiect literal. Apoi eliminăm toate mesajele de succes care pot apărea din interacțiunile de sortare anterioare. Apoi, procesăm fiecare dintre imaginile din grila de imagini utilizând jQuery fiecare() , care va executa funcția anonimă specificată o dată pentru fiecare imagine din listă. Această funcție este transmisă automat un număr de index pentru elementul curent, de care trebuie să facem uz.

    În cadrul acestei funcții se creează un nou obiect literal și se dau două proprietăți; id a imaginii curente și numărul indexului curentului fiecare() repetare. Apoi inserăm acest obiect în matricea pe care am creat-o acum un moment. După ce am făcut acest lucru pentru fiecare imagine din pagină, inserăm matricea într-un obiect de împachetare. Acest obiect va fi trecut pe server, care se face folosind jQuery's low-level ajax () metodă.

    Trebuie să folosim ajax () în loc de, să zicem, post() sau getJSON () metode, deoarece trebuie să specificăm tipul de conținut pentru ca serverul să proceseze corect datele. Am setat tipul de solicitare la POST, specificați fișierul de pe server cu numele metodei care va gestiona solicitarea ca parametru de șir de interogare. De asemenea, trecem în obiectul de înfășurare pregătit. Pentru a converti complet obiectul în sintaxa JSON, folosim stringify () metodă a json2.js fişier.

    De asemenea, specificăm un handler de succes care va fi executat după finalizarea solicitării; putem vedea șirul returnat de server accesând datele trimise înapoi la acest programator de succes. Șirul real va fi conținut într - o proprietate a date obiect etichetat d. Datele returnate pe o pagină prin AJAX în .Net sunt de obicei accesate prin intermediul unui a d obiect în acest fel.

    Putem adăuga un mesaj diferit și un nume de clasă la pagină, în funcție de faptul că serverul indică faptul că cererea a fost un succes sau un eșec. Puteți testa acest lucru și puteți vedea diferitele mesaje utilizând Firebug pentru a schimba id atributul unuia dintre containerele de imagine unei valori care nu există în baza de date și apoi sortarea unei imagini. Astfel trebuie să apară mesajele noastre:


    Fișierul metodei Active Server

    Pentru a primi obiectul JSON transmis către server prin intermediul AJAX după o interacțiune de sortare, putem folosi un fișier asmx; faceți clic dreapta pe rădăcina site-ului în Soluție Explorer și alegeți Adăugați un element nou. În caseta de dialog care apare alegeți Serviciu web în secțiunea de sus și Visual C # în Limba selectați caseta, apoi faceți clic pe Adăuga.

    Acest lucru vă va oferi un nou WebService.asmx fișier în site-ul dvs., dar codul-spatele pentru acest fișier va merge într-un folder creat automat numit App_code. Nu avem nevoie să actualizăm deloc fișierul asmx, totul se va face în codul din spate WebService.asmx.cs fişier. Deschideți-l și veți vedea că în fișier există deja multe coduri; modificați-o astfel încât fișierul să apară în întregime după cum urmează:

    utilizând Sistemul; folosind System.Collections.Generic; utilizând System.Data; utilizând System.Data.SqlClient; folosind System.Linq; utilizând System.Web; utilizând System.Web.Services; utilizând System.Web.Script.Services; ///  /// Primeste si salveaza o noua ordine de imagini ///  [WebServiceBinding (ConformsTo = WsiProfiles.BasicProfile1_1)] // Pentru a permite ca acest serviciu Web să fie apelat din script, folosind ASP.NET AJAX, detașați următoarea linie. [System.Web.Script.Services.ScriptService] clasă publică WebService: System.Web.Services.WebService public class ImageDTO public string id get; a stabilit;  public int order get; a stabilit;  [WebMethod] șirul public de actualizareOrder (Listă d) // defini conexiunea SqlConnection dbCon = nou SqlConnection ("Server = DESKTOP \\ SQLEXPRESS; UID = sa; PWD = your_password; Database = image_organiser"); // proces JSON obiect foreach (ImageDTO img în d) // definiți șir de procedură sSQL = "Actualizare set de imagini [order] =" + img.order + "unde id =" + img.id; încercați // deschideți conexiunea dbCon.Open (); // actualizare date cmd.ExecuteNonQuery (); // închide conexiunea dbCon.Close ();  captură (SqlException ex) return "nu a reușit";  // succes! retur "salvat"; 

    Trebuie să adăugăm mai multe spații de nume în secțiunea de utilizare din partea de sus a fișierului pentru a lucra cu baza de date SQL. De asemenea, trebuie să ne asigurăm că necompletăm linia care permite serviciului nostru Web să fie apelat din script-ul în pagina principală aspx (este clar marcat cu un comentariu în versiunea implicită a fișierului).

    În cadrul Serviciu web trebuie să adăugăm o nouă clasă care reprezintă fiecare dintre obiectele interioare din matricea trecută serviciului web. Facem asta cu ImageDTO clasă și să dea fiecare obiect id și Ordin proprietățile și atribuirea metodelor getter și setter pentru a lucra cu valorile acestor proprietăți.

    Apoi vine metoda care este chemată din scenariul nostru; updateOrder metoda web. Această metodă primește d obiect pe care îl aruncăm ca o listă de ImageDTO obiecte; atunci vom putea folosi metodele definite în clasa noastră pentru a accesa fiecare proprietate.

    Definim informațiile de conectare necesare conectării la baza noastră de date și apoi procesăm fiecare obiect din site-ul nostru Lista de imagini. Extragem noua comandă și id a imaginii și pentru a le actualiza Ordin pentru rândul corespunzător din tabelul MSSQL.

    Acest cod este relativ similar cu codul folosit pentru a obține informațiile din baza de date la încărcarea paginii, pur și simplu folosim un alt șir de conexiuni și folosim ExecuteNonQuery () în loc de ExecuteReader () deoarece actualizăm baza de date în loc să citim doar din ea. Înfășurăm, de asemenea, execuția conexiunii într-o rețea încearcă să prinzi instrucțiune și fie ieșiți șirul a eșuat sau salvate în funcție de succesul actualizării.


    rezumat

    Am folosit aroma c # a .Net combinată cu jQuery UI în acest tutorial pentru a crea o pagină care să rețină ordinea imaginilor pe ea și permite ca imaginile să fie reordonate în funcție de capriciile și dorințele vizitatorului de pagină. În acest exemplu este o pagină simplă, dar nu uitați că, într-o implementare corectă, acest lucru ar fi probabil accesibil doar de către utilizatorul autentificat; fiecare utilizator ar avea acces la propriile sale imagini și ar putea să le sorteze, în timp ce imaginile vor fi fixate pe versiunea accesibilă publicului a paginii.

    Nu am făcut nici o dezinfectare a datelor care sunt transmise în fișierul de pe server care actualizează baza de date; deși utilizatorul nu introduce datele într-un câmp de text, cererea de ieșire de pe pagină poate fi manipulată cu ușurință pentru a trimite cod rău intenționat serverului. Pericolul acestui tip de atac ar fi limitat, deoarece probabil vom permite doar sortarea în primul rând a utilizatorilor înregistrați, autentificați. Deși securitatea depășește domeniul de aplicare al acestui tutorial, ar trebui să fie întotdeauna o preocupare principală atunci când se ocupă de codul viu.

    Cod