En jQuery UI og. Net Image Organizer

I løpet av denne opplæringen ser vi på hvordan du lager et enkelt bilde arrangør som lar brukerne omordne en rekke bilder; Denne funksjonaliteten kan være nyttig på noen form for bildebasert nettsted der brukerne har en samling bilder som de har lastet opp eller på annen måte lagt til i profilen eller kontoen. Vi bruker .net for å hente og lagre rekkefølgen av bilder i en SQL-database på serveren, og jQuery brukergrensesnitt for å håndtere omorganisering av bildene på klienten.


Starter

Siden vi lager, vil være av typen aspx; Vi kan opprette og redigere disse filene med en enkel tekstredigerer om nødvendig, men det er langt mer effektivt å bruke en riktig .Net IDE. Visual Web Developer Express fra Microsoft er et flott. Net IDE, og det er helt gratis; Ta en kopi nå fra http://www.microsoft.com/express/Web/. Den kan lastes ned som en del av nettplattformen; Du kan velge en rekke forskjellige produkter når du laster ned den. I denne veiledningen bruker vi følgende komponenter:

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

Webplatformen er faktisk ganske bra, og gir deg tilgang til et bredt spekter av populære webapplikasjoner og rammer, som dotNetNuke, Joomla, Umbraco og mange andre, og plattforminstallatøren laster ned og konfigurerer alt du trenger. Det tar litt tid å laste ned og installere, så mens det gjør ting kan vi sette opp et utviklingsområde; lag en ny mappe og ring den image_organiser, så lag i denne mappen to nye mapper og ring dem js og css.

Du bør også ta en kopi av den nyeste versjonen av jQuery UI; Gå over til nedlastingsbyggeren på http://jqueryui.com/download og kontroller at følgende komponenter til venstre på siden er merket:

  • Kjerne
  • Widget
  • Mus
  • sorterbar

Et tema er ikke nødvendig, men sørg for versjon 1.8 er valgt til høyre på siden, og deretter trykker du nedlastningsknappen. Når arkivet har lastet ned, åpner du det og kopierer følgende filer fra js mappe i arkivet til js mappe vi nettopp har opprettet:

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

Vi benytter også Doug Crockfords utmerkede JSON-verktøy, som kan lastes ned fra http://www.JSON.org/json2.js. Lagre en kopi av denne filen til vår js mappe og sørg for å fjerne varselet fra toppen av filen.

Når plattforminstallatøren er ferdig, brann du opp Visual Web Developer Express og går til Fil " Åpent nettsted og velg deretter image_organiser prosjektmappe som vi nettopp har opprettet. Du får en rask spørring om du skal oppgradere nettstedet til å bruke .net 3.5; velge Ja.


Opprette en database

Vi lager en ny database og tabell for dette eksempelet; åpne SQL Server Management Studio og koble til den lokale forekomsten av SQL Server (den kalles noe som Datamaskinnavn \ SQLExpress). For å opprette en ny database, høyreklikk på databaser mappe og velg Ny database. I dialogboksen som vises, angir databasenavnet til image_organiser og klikk deretter ok. Du bør da se den nye databasen som er oppført i venstre rute av lederen.

Vi må nå lage et nytt bord i vår nye database; utvide den nye databasen, høyreklikk deretter på tabeller mappe og velg Nytt bord. Administrasjonskonsollen vil gi deg et par ekstra paneler; en som viser tabellens kolonner og en som viser tabellegenskapene. Legg til tre kolonner i bordet, den første skal ha navnet src og være av typen varchar (50), den andre skal ha navnet alt og også være av typen varchar (50). Den endelige kolonnen kalles [rekkefølge] og er av typen int. Bare den alt kolonne skal tillate null verdier.

Klikk på diskikonet på verktøylinjen og velg navnet Bilder. Når du utvider tabeller mappe i Objekt Explorer til venstre bør den nye tabellen vises. I en full implementering vil hver bruker av programmet ha sitt eget sett med bilder, og det vil uten tvil være andre tabeller i databasen for brukernavn og passord og annen informasjon knyttet til brukeren. For formålet med denne opplæringen, tenk at vi er en enkelt autentisert bruker som manipulerer vårt eget sett med bilder.

Nå må vi fylle tabellen med noen data; høyreklikk på det nye bordet og velg Rediger topp 200 rader; Konsollen vil endres igjen, slik at du får et redigerbart bilde av bordet. en id kolonnen settes automatisk inn i tabellen I dette eksemplet har jeg bare brukt et nullbasert indeksnummer for verdiene i denne kolonnen, men dette bør samsvare med filnavnene til bildene som er i bruk. Bruk dataene som vises her:


Aspx-filen

For å opprette en ny aspx-side, høyreklikk roten til nettstedet i Solution Explorer til høyre for søknaden og velg Legg til nytt element. I dialogboksen som vises velger du Nettformular i toppseksjonen og Visual C # i Språk velg boks. Klikk Legg til.

Dette vil gi en ny side som heter default.aspx, som åpnes automatisk i IDE. Den nye siden er oppført i Solution Explorer til høyre og det har et plussikon ved siden av det som indikerer at det inneholder noe. For de av dere som aldri har jobbet med. Net før, inneholder den koden bak aspx.cs fil som vi kan bruke til å legge til server-side logikken for siden litt senere.

Aspx-filen vil ha noen elementer i den allerede, inkludert a

; legg til følgende kode i element:

Bilde arrangør

Ombestill bildene ved å dra et bilde til et nytt sted. Dine endringer blir lagret automatisk.

Vi har en enkel ytre beholder med to

elementer inne i det; man har noen korte instruksjoner mens den andre vil bli brukt til å holde sorterbare bildeelementer. For å fylle bildebeholderen med bildene fra databasen kan vi bruke den praktiske .Net Repeater kontrollen; legg til følgende kode inne i bildebeholderen:

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

Vi bruker element som reperatorkontroll vi nettopp har lagt til siden. Når du åpner opp Default.aspx.cs filen vil du se at det er flere elementer i filen allerede; det er en serie av ved hjelp av direktiver øverst på filen som angir til serveren navnene på .Net-komponentene som kreves av aspx-filen. I tillegg til de som er inkludert i filen, må vi også legge til følgende:

bruker System.Data; bruker System.Data.SqlClient;

Etter dette har vi en klasses Definisjon og a Page_Load Event Handler som vi kan bruke til å utføre server-side kode når aspx siden laster. Innenfor denne hendelsen legger du til følgende kode:

// definere tilkobling SqlConnection dbCon = ny SqlConnection ("Server = DESKTOP \\ SQLEXPRESS; UID = sa; PWD = din_password; Database = image_organiser"); // definere søkeordet sSQL = "Velg * fra bilder"; // definere kommando SqlCommand cmd = new SqlCommand (sSQL, dbCon); // åpen tilkobling dbCon.Open (); // les data SqlDataReader ds = cmd.ExecuteReader (); // bind til repeater imageRepeat.DataSource = ds; imageRepeat.DataBind (); // Lukk forbindelse dbCon.Close ();

Koden er veldig rett frem, la oss gå gjennom det; vi definerer en ny SqlConnection bruker variabelen dbCon. Verdien av denne variabelen er forbindelsesstrengen vi bruker til å koble til databasen og består av servernavnet, brukernavnet (SA er standard), passord og database navn. Ikke glem å bytte ut ditt passord i koden ovenfor med passordet du angir når du installerer SQL.

Neste definerer vi spørringen vår, som i dette tilfellet er bare å velge alt i databasen ved hjelp av * wildcard. Vi lagrer også SqlCommand i en variabel som består av spørringen og forbindelsen. Etter dette kan vi åpne forbindelsen med Åpen() metode og les dataene i a SqlDataReader variabel med ExecuteReader () metode kalt på SqlCommand.

Til slutt binder vi dataene til vår repeaterkontroll ved å sette inn ds variabel som repeaterens Datakilde og ringer til DataBind () metode på det, før du endelig lukker databasetilkoblingen. Vi trenger ikke å velge repeaterkontrollen, vi kan bare referere til den direkte ved hjelp av ID Vi spesifiserte på aspx siden. Den første fasen av koden vår er nå fullført, repeateren vil vise en

  • og for hver rad i vår database. Det vil se litt tørt ut på dette punktet, men la oss legge til noen grunnleggende styling.


    Styling the Page

    For å legge til et nytt stilark til nettstedet, høyreklikk på css mappe i Solution Explorer til høyre og velg Legg til nytt element; å velge Stilark i øverste rute i dialogboksen og sett inn Navn feltet til image_organiser.css, deretter treffer Legg til. Den nye filen åpnes automatisk i IDE; legg til følgende kode for det:

    #outerWrap width: 1004px; margin: auto; stilling: i forhold; background-color: #eee; grense: 1px solid # 999;  #outerWrap: etter innhold: "."; display: block; synlighet: skjult; klar: begge;  h1 skrift: kursiv normal 24px Georgia, Serif; tekst-Justering: center; margin: 10px 0;  p margin: 0; font: 12px Arial, Sans-serif; polstring: 0 10px;  #left width: 218px; float: venstre;  #images margin: 0; padding: 0; float: venstre; bredde: 786px;  #images li listestil-type: none; float: venstre; Markøren: flytter; margin: 10px 10px 0 0; bredde: 250px; høyde: 250 px; grense: 1px solid # 999;  #images .vacant border: 3px dotted # 66d164; bredde: 246px; høyde: 246px; background-color: #fff;  .success, .failure margin: 0 0 0 10px; polstring: 4px 0 4px 26px; stilling: absolutt; bunn: 18 piksler; font-vekt: bold;  .success background: url ('... /img/tick.png') no-repeat 0 1px; color: # 12751c;  .failure background: url ('... /img/cross.png') no-repeat 0 0; color: # 861b16; 

    Disse grunnleggende stilene legger bare ut siden i formatet vi vil ha for dette eksempelet. Det er ingenting veldig viktig her, noe av det kan lett endres for å passe andre krav. Ikke glem å lenke til det nye stilarket i av siden med følgende:

    På dette tidspunktet skal siden nå vises som dette når den først lastes i nettleseren:

    Du kan vise siden ved å høyreklikke aspx-filen i Solution Explorer og velge Se i nettleseren. Dette vil bruke IDEs innebygde webserver til å vise siden.


    Gjøre bildene sorterbare

    Poenget til siden er å gjøre bildene sorterbare slik at brukeren kan ordne dem på nytt. For å gjøre dette må vi koble til jQuery UI-filene i vår js-mappe; legg til følgende

    Å gjøre bildene sorterbare er ekstremt enkelt; etter det ovennevnte

    Alt vi gjør er å ringe sorterbar () metode på beholderen av elementene vi ønsker å kunne sortere. Vi leverer et konfigurasjonsobjekt til metoden som spesifiserer klassenavnet som skal brukes på det tomme sporet at elementet som sorteres, kan slippes inn ved hjelp av plassholder alternativ, og en tilbakeringingsfunksjon som skal utføres når en sortering oppstår, og rekkefølgen på elementene endres. Når vi kjører siden på dette punktet, bør vi oppdage at bildene er sorterbare og at vår ledig stiler brukes:


    Lagre den nye bestillingen

    Alt vi trenger å gjøre nå i hovedfilen .aspx, sendes den nye rekkefølgen av bildene til serveren når bildene sorteres. erstatte kommentaren i Oppdater tilbakeringing med følgende kode:

    // lage vars var orderArray = [], wrap = ; / / tilbakestill 'lagret' melding $ ("suksess", $ ("# venstre")). fjern (); // prosess hvert bilde $ ("# images img"). hver (funksjon (i) // bygge img objekt var imgObj = "id": $ (dette) .parent (). attr ("id"). split ("_") [1], "rekkefølge": i + 1; // legge til objekt i array orderArray.push (imgObj);); // pakke inn objekt wrap.d = orderArray; // pass til server $ .ajax (type: "POST", url: "WebService.asmx / updateOrder", data: JSON.stringify (wrap), contentType: "application / json; charset = utf-8" : funksjon (data) if (data.d === "saved") $ ("

    ") .text (" Ny ordre lagret! ") .addClass (" suksess "). appendTo (" # left "); else $ ("

    ") .text (" Lagre mislyktes ") .addClass (" feil "). appendTo (" # left "););

    La oss se på hva denne koden gjør; Først oppretter vi et par variabler som vi senere trenger i skriptet, den første er en matrise bokstavelig, den andre et objekt bokstavelig. Vi fjerner deretter eventuelle suksessmeldinger som kan være til stede fra tidligere sorteringsinteraksjoner. Vi behandler deretter hvert av bildene i bildegitteret ved hjelp av jQuery's Hver() metode som vil utføre den anonyme funksjonen vi spesifiserer en gang for hvert bilde i listen. Denne funksjonen passerer automatisk et indeksnummer for det nåværende elementet, som vi må benytte oss av.

    Innenfor denne funksjonen oppretter vi et nytt objekt bokstavelig og gir det to egenskaper; de id av det nåværende bildet, og indeksnummeret til gjeldende Hver() iterasjon. Vi legger da inn dette objektet i gruppen vi opprettet for øyeblikket. Når vi har gjort dette for hvert bilde på siden, setter vi inn arrayet i et innpakningsobjekt. Dette objektet sendes til serveren, som er gjort ved hjelp av jQuery's lavnivå Ajax () metode.

    Vi må bruke Ajax () metode i stedet for, si, post() eller getJSON () metoder, fordi vi må spesifisere innholdstype for at serveren skal kunne behandle dataene riktig. Vi stiller forespørselstypen til POST, spesifiser server-sidefilen med navnet på metoden som vil håndtere forespørselen som en forespørselsstrengparameter. Vi passerer også i vårt forberedte wrap-objekt. For å konvertere objektet fullt ut til JSON syntaks bruker vi stringify () metode av json2.js fil.

    Vi spesifiserer også en suksesshandler som vil bli utført når forespørselen er fullført. vi kan se strengen returnert av serveren ved å få tilgang til dataene som sendes tilbake til denne suksesshandleren. Den faktiske strengen vil være inneholdt i en egenskap av data objekt merket d. Data returnert til en side via AJAX i. Net er vanligvis tilgjengelig via a d objekt på denne måten.

    Vi kan legge til en annen melding og klassenavn til siden, avhengig av om serveren indikerer at forespørselen var en suksess eller feil. Du kan teste dette og se de forskjellige meldingene ved å bruke Firebug for å endre id Attributt av en av bildebeholdere til en verdi som ikke eksisterer i databasen, og deretter sortere et bilde. Slik viser våre meldinger:


    Den aktive servermetoden filen

    For å motta JSON-objektet som sendes til serveren via AJAX etter en sorteringsinteraksjon, kan vi bruke en asmx-fil; høyreklikk roten til nettstedet i Solution Explorer og velg Legg til nytt element. I dialogboksen som vises velger du Nettjeneste i toppseksjonen og Visual C # i Språk velg boks, og klikk deretter Legg til.

    Dette vil gi deg en ny WebService.asmx filen på nettstedet ditt, men koden bak for denne filen vil gå inn i en automatisk opprettet mappe som heter App_code. Vi trenger ikke å oppdatere asmx filen i det hele tatt, alt vil bli gjort i koden bak WebService.asmx.cs fil. Åpne den opp, og du vil se at det allerede er mye kode i filen; endre den slik at filen i sin helhet vises som følger:

    bruker system; bruker System.Collections.Generic; bruker System.Data; bruker System.Data.SqlClient; bruker System.Linq; bruker System.Web; bruker System.Web.Services; bruker System.Web.Script.Services; ///  /// Mottar og lagrer ny rekkefølge av bilder ///  [WebServiceBinding (ConformsTo = WsiProfiles.BasicProfile1_1)] // For å tillate at denne webtjenesten blir kalt fra skript, bruker ASP.NET AJAX, uncomment følgende linje. [System.Web.Script.Services.ScriptService] offentlig klasse WebService: System.Web.Services.WebService offentlig klasse ImageDTO public string id get; sett;  public int order get; sett;  [WebMethod] public string updateOrder (List d) // definer forbindelse SqlConnection dbCon = ny SqlConnection ("Server = DESKTOP \\ SQLEXPRESS; UID = sa; PWD = din_password; Database = image_organiser"); // prosess JSON objekt foreach (ImageDTO img i d) // definer prosedyre streng sSQL = "Oppdater bilder sett [rekkefølge] =" + img.order + "hvor id =" + img.id; prøv // åpen forbindelse dbCon.Open (); // Oppdater data cmd.ExecuteNonQuery (); // Lukk forbindelse dbCon.Close ();  fangst (SqlException ex) retur "mislyktes";   //suksess! returnere "lagret"; 

    Vi må legge til flere navneområder i brukerdelen øverst i filen for å kunne jobbe med vår SQL-database. Vi må også sikre at vi uncomment linjen som tillater at vår webtjeneste blir kalt fra skriptet i hovedaspx-siden (det er tydelig merket med en kommentar i standardversjonen av filen).

    Innen Nettjeneste klasse må vi legge til en ny klasse som representerer hver av de indre objektene i gruppen som sendes til webtjenesten. Vi gjør dette med ImageDTO klasse og gi hvert objekt id og rekkefølge egenskaper og tilordne getter og setter metoder for å jobbe med verdiene av disse egenskapene.

    Neste kommer metoden som kalles fra vårt skript; de updateOrder web-metoden. Denne metoden mottar d objekt som vi kaster som en liste over ImageDTO objekter, Vi vil da kunne bruke metodene som er definert i vår klasse for å få tilgang til hver eiendom.

    Vi definerer tilkoblingsinformasjonen som trengs for å koble til vår database og deretter behandle hvert objekt i vår ImageDTO-listen. Vi trekker ut den nye ordren og id av bildet og bruk dette for å oppdatere rekkefølge kolonne for den tilsvarende raden i MSSQL-tabellen.

    Denne koden er relativt lik koden vi brukte for å få informasjonen ut av databasen på sidebelastning, vi bruker bare en annen tilkoblingsstreng og bruker ExecuteNonQuery () metode i stedet for ExecuteReader () fordi vi oppdaterer databasen i stedet for å bare lese fra den. Vi pakker også vår tilkobling i en prøv ... fange setning og enten utføre strengen mislyktes eller lagret avhengig av om oppdateringen lykkes.


    Sammendrag

    Vi brukte c # smaken av. Net kombinert med jQuery UI i denne opplæringen for å lage en side som husker rekkefølgen på bildene på den, og tillater bildene å bli omorganisert i henhold til lystene og begjærene til den besøkende til siden. I dette eksemplet er det en enkel side, men ikke glem at det ved en riktig implementering kun vil være tilgjengelig bare av den autentiserte brukeren; hver bruker vil ha tilgang til sine egne bilder og kunne sortere dem, mens bildene vil bli løst på den offentlig tilgjengelige versjonen av siden.

    Vi gjorde ingen sanitisering av dataene som ble sendt inn i server-sidefilen som oppdaterer databasen; Selv om brukeren ikke oppgir dataene i et tekstfelt, kan den utgående forespørselen fra siden lett bli manipulert for å sende skadelig kode til serveren. Faren for denne typen angrep ville være begrenset, da vi sannsynligvis bare ville tillate sortering i utgangspunktet til registrerte, autentiserte brukere. Selv om sikkerhet er utenfor omfanget av denne opplæringen, bør det alltid være en primær bekymring når det gjelder live kode.