Een jQuery UI en .Net Image Organizer

In de loop van deze tutorial zullen we kijken hoe we een eenvoudige image-organizer kunnen maken waarmee gebruikers een reeks afbeeldingen kunnen nabestellen; deze functionaliteit kan handig zijn op elke afbeeldingwebsite waar gebruikers een verzameling afbeeldingen hebben die ze hebben geüpload of anderszins hebben toegevoegd aan hun profiel of account. We zullen .net gebruiken om de volgorde van afbeeldingen in een SQL-database op de server op te halen en op te slaan, en jQuery UI voor het herschikken van de afbeeldingen op de client.


Ermee beginnen

De pagina die we maken is van het type aspx; we kunnen deze bestanden maken en bewerken met een eenvoudige teksteditor indien nodig, maar het is veel efficiënter om een ​​juiste .Net IDE te gebruiken. Visual Web Developer Express van Microsoft is een geweldige .Net IDE en deze is helemaal gratis; neem nu een exemplaar van http://www.microsoft.com/express/Web/. Het kan worden gedownload als onderdeel van het Web Platform; je kunt een aantal verschillende producten kiezen wanneer je het downloadt, voor de doeleinden van deze tutorial zullen we de volgende componenten gebruiken:

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

Het Web Platform is eigenlijk best goed en geeft je toegang tot een breed scala aan populaire webapplicaties en frameworks, zoals dotNetNuke, Joomla, Umbraco en vele anderen, en het platform-installatieprogramma downloadt en configureert alles wat je nodig hebt. Het downloaden en installeren duurt even, dus terwijl het zijn ding doet, kunnen we een ontwikkelgebied opzetten; maak een nieuwe map en noem hem image_organiser, maak vervolgens in deze map twee nieuwe mappen en noem ze js en css.

Je zou ook een kopie van de nieuwste versie van jQuery UI moeten nemen; ga naar de downloadbuilder op http://jqueryui.com/download en zorg dat de volgende componenten aan de linkerkant van de pagina zijn aangevinkt:

  • Kern
  • widget
  • Muis
  • Sorteerbaar

Een thema is niet verplicht maar zorg ervoor versie 1.8 is geselecteerd aan de rechterkant van de pagina en druk vervolgens op de downloadknop. Nadat het archief is gedownload, opent u het en kopieert u de volgende bestanden van de js map in het archief naar de js map die we zojuist hebben gemaakt:

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

We maken ook gebruik van het uitstekende JSON-hulpprogramma van Doug Crockford, dat kan worden gedownload van http://www.JSON.org/json2.js. Sla een kopie van dit bestand op naar onze js map en zorg ervoor dat u de waarschuwing boven aan het bestand verwijdert.

Zodra het platforminstallatieprogramma is voltooid, start u Visual Web Developer Express en gaat u naar het dossier " Open de website en kies vervolgens de image_organiser projectmap die we zojuist hebben gemaakt. U krijgt een prompt met de vraag of u de site wilt upgraden om .net 3.5 te gebruiken; Kiezen Ja.


Een database maken

We zullen een nieuwe database en tabel voor dit voorbeeld maken; open de SQL Server Management Studio en maak verbinding met de lokale instantie van SQL Server (het zal zoiets heten) COMPUTERNAME \ SQLEXPRESS). Klik met de rechtermuisknop op de knop om een ​​nieuwe database te maken databases map en kies Nieuwe database. Stel de databasenaam in in het dialoogvenster dat verschijnt image_organiser en klik vervolgens op OK. Vervolgens ziet u de nieuwe database in het linkerdeelvenster van de manager.

We moeten nu een nieuwe tabel maken in onze nieuwe database; vouw de nieuwe database uit en klik met de rechtermuisknop op de tabellen map en kies Nieuwe tafel. De beheerconsole geeft u een aantal extra panelen; één met de tabelkolommen en één met de tabeleigenschappen. Voeg drie kolommen toe aan de tabel, de eerste moet de naam hebben src en wees van het type VARCHAR (50), de tweede zou de naam moeten hebben alt en ook van het type zijn VARCHAR (50). De laatste kolom wordt genoemd [bestellen] en is van het type int. Alleen de alt kolom zou moeten toestaan nul waarden.

Klik op het schijfpictogram op de werkbalk en kies de naam afbeeldingen. Wanneer u de uitvouwt tabellen map in de Objectverkenner aan de linkerkant moet de nieuwe tabel worden vermeld. Bij een volledige implementatie zou elke gebruiker van de toepassing zijn eigen set afbeeldingen hebben en er zouden ongetwijfeld andere tabellen in de database zijn voor gebruikersnamen en wachtwoorden en andere informatie die aan de gebruiker is gekoppeld. Stel je voor deze tutorial voor dat we één geverifieerde gebruiker zijn die onze eigen set afbeeldingen manipuleert.

Nu moeten we de tabel vullen met wat gegevens; klik met de rechtermuisknop op de nieuwe tabel en kies Bewerk Top 200 rijen; de console zal opnieuw veranderen, zodat u een bewerkbare weergave van de tabel hebt. Een ID kaart kolom wordt automatisch in de tabel ingevoegd; in dit voorbeeld heb ik eenvoudig een op nul gebaseerd indexnummer gebruikt voor de waarden in deze kolom, maar dit moet overeenkomen met de bestandsnamen van de afbeeldingen die in gebruik zijn. Gebruik de gegevens die hier worden getoond:


Het aspx-bestand

Om een ​​nieuwe aspx-pagina te maken, klikt u met de rechtermuisknop op de hoofdmap van de site in de Solution Explorer aan de rechterkant van de applicatie en kies Voeg een nieuw item toe. Kies in het dialoogvenster dat verschijnt Webformulier in het bovenste gedeelte en Visual C # in de Taal selecteer het vakje. Klik Toevoegen.

Dit geeft een nieuwe pagina genaamd default.aspx, die automatisch wordt geopend in de IDE. De nieuwe pagina wordt vermeld in de Solution Explorer aan de rechterkant en er staat een plus-pictogram naast dat aangeeft dat het iets bevat. Voor degenen onder u die nog nooit met .Net hebben gewerkt, bevat het de achterliggende code aspx.cs bestand dat we kunnen gebruiken om de server-side logica voor de pagina iets later toe te voegen.

Het aspx-bestand bevat al een paar elementen, waaronder een

; voeg de volgende code toe binnen de element:

Image Organizer

Sorteer de afbeeldingen opnieuw door een afbeelding naar een nieuwe locatie te slepen. Uw wijzigingen worden automatisch opgeslagen.

We hebben een eenvoudige buitenverpakking met twee

elementen erin; de ene bevat enkele korte instructies, terwijl de andere wordt gebruikt om de sorteerbare afbeeldingselementen vast te houden. Om de afbeeldingencontainer met de afbeeldingen uit de database te vullen, kunnen we de handige .Net Repeater-besturing gebruiken; voeg de volgende code toe aan de afbeeldingencontainer:

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

Wij gebruiken de element dat herhaling controle die we zojuist hebben toegevoegd aan de pagina. Wanneer u de. Opent Default.aspx.cs bestand zult u zien dat er al verschillende items in het bestand zijn; er zijn een serie van gebruik makend van richtlijnen boven aan het bestand die de server de naamruimten van de .Net-componenten aangeven die vereist zijn voor het aspx-bestand. Behalve die in het bestand zijn opgenomen, moeten we ook het volgende toevoegen:

met behulp van System.Data; met behulp van System.Data.SqlClient;

Hierna hebben we een klassendefinitie en een Page_Load event handler die we kunnen gebruiken om server-side code uit te voeren wanneer de aspx-pagina laadt. Voeg binnen deze gebeurtenishandler de volgende code toe:

// define connection SqlConnection dbCon = new SqlConnection ("Server = DESKTOP \\ SQLEXPRESS; UID = sa; PWD = your_password; Database = image_organiser"); // define query string sSQL = "Selecteer * uit afbeeldingen"; // define command SqlCommand cmd = new SqlCommand (sSQL, dbCon); // open verbinding dbCon.Open (); // lees gegevens SqlDataReader ds = cmd.ExecuteReader (); // bind naar repeater imageRepeat.DataSource = ds; imageRepeat.DataBind (); // close connection dbCon.Close ();

De code is heel eenvoudig, laten we er doorheen lopen; we definiëren een nieuw SqlConnection de variabele gebruiken dbCon. De waarde van deze variabele is de verbindingsreeks die we gebruiken om verbinding te maken met de database en bestaat uit de servernaam, gebruikersnaam (sa is de standaard), wachtwoord en databasenaam. Vergeet niet te vervangen uw wachtwoord in de bovenstaande code met het wachtwoord dat u instelt bij het installeren van SQL.

Vervolgens definiëren we onze vraag, die in dit geval is om alles in de database te selecteren met behulp van de * wildcard. We slaan ook het SqlCommand in een variabele die bestaat uit de query en de verbinding. Hierna kunnen we vervolgens de verbinding openen met de Open() methode en lees de gegevens in a SqlDataReader variabel met de ExecuteReader () methode op de SqlCommand.

Ten slotte binden we de gegevens aan onze repeatercontrole door de ds variabel als de repeater's Databron en de DataBind () methode erop, voordat de databaseverbinding definitief wordt gesloten. We hoeven de repeater-besturing niet te selecteren, we kunnen er gewoon rechtstreeks naar verwijzen met behulp van de ID kaart we specificeerden in de aspx-pagina. De eerste fase van onze code is nu voltooid, de repeater geeft een weer

  • en voor elke rij van onze database. Het zal er op dit punt wat flauwtjes uitzien, dus laten we wat basisstyling toevoegen.


    De pagina stylen

    Klik met de rechtermuisknop op de knop om een ​​nieuw stijlblad aan de site toe te voegen css map in de Solution Explorer aan de rechterkant en kies Voeg een nieuw item toe; kiezen Style Sheet in het bovenste deelvenster van het dialoogvenster en stel de Naam veld naar image_organiser.css, dan raken Toevoegen. Het nieuwe bestand wordt automatisch geopend in de IDE; voeg de volgende code toe:

    #outerWrap width: 1004px; margin: auto; position: relative; background-color: #eee; rand: 1px vast # 999;  #outerWrap: after content: "."; display: block; visibility: hidden; beiden opschonen;  h1 font: italic normal 24px Georgia, Serif; text-align: center; marge: 10 px 0;  p marge: 0; lettertype: 12px Arial, Sans-serif; opvulling: 0 10px;  #left width: 218px; float: left;  #afbeelding marge: 0; padding: 0; float: left; width: 786px;  #images li list-style-type: none; float: left; cursor: move; marge: 10 px 10 px 0 0; Breedte: 250 pixels; hoogte: 250 pixels; rand: 1px vast # 999;  #images .vacant border: 3px dotted # 66d164; width: 246px; Hoogte: 246px; background-color: # fff;  .success, .failure margin: 0 0 0 10px; opvulling: 4px 0 4px 26px; positie: absoluut; bottom: 18px; font-weight: bold;  .success background: url ('... /img/tick.png') geen herhaling 0 1px; color: # 12751c;  .failure background: url ('... /img/cross.png') no-repeat 0 0; color: # 861b16; 

    Deze basisstijlen leggen de pagina simpelweg in het gewenste formaat voor dit voorbeeld. Er is hier niets echt belangrijks, elk onderdeel kan gemakkelijk worden aangepast aan andere vereisten. Vergeet niet om te linken naar de nieuwe stylesheet in de van de pagina met het volgende:

    Op dit punt zou de pagina nu als volgt moeten verschijnen wanneer deze voor het eerst in de browser wordt geladen:

    U kunt de pagina bekijken door met de rechtermuisknop te klikken op het aspx-bestand in de Solution Explorer en kiezen Bekijk in browser. Hiermee wordt de ingebouwde webserver van de IDE gebruikt om de pagina weer te geven.


    De afbeeldingen sorteerbaar maken

    Het doel van de pagina is om de afbeeldingen sorteerbaar te maken zodat de gebruiker ze opnieuw kan ordenen. Hiervoor moeten we een link maken naar de jQuery UI-bestanden in onze js-map; voeg het volgende toe

    Het sorteerbaar maken van afbeeldingen is uiterst eenvoudig; na het bovenstaande

    Alles wat we doen is het sorteerbaar() methode op de container van de items die we zouden willen kunnen sorteren. We leveren een configuratieobject aan de methode die de klassenaam opgeeft die moet worden toegepast op de lege sleuf waarop het item dat wordt gesorteerd, kan worden neergezet met behulp van de placeholder optie en een callback-functie die moet worden uitgevoerd wanneer een sortering plaatsvindt en de volgorde van de items verandert. Wanneer we de pagina op dit punt uitvoeren, moeten we vaststellen dat de afbeeldingen sorteerbaar zijn en dat onze vrijgekomen stijlen worden toegepast:


    De nieuwe volgorde opslaan

    Alles wat we nu moeten doen in het hoofdaspx-bestand, is de nieuwe volgorde van de afbeeldingen naar de server sturen wanneer de afbeeldingen zijn gesorteerd; vervang de opmerking in de bijwerken terugbellen met de volgende code:

    // create vars var orderArray = [], wrap = ; // reset 'saved' message $ (". success", $ ("# left")). remove (); // verwerk elke afbeelding $ ("# images img"). each (functie (i) // build img object var imgObj = "id": $ (this) .parent (). attr ("id"). splitsen ("_") [1], "volgorde": i + 1; // object toevoegen aan array orderArray.push (imgObj);); // wrap in object wrap.d = orderArray; // doorgeven aan server $ .ajax (type: "POST", url: "WebService.asmx / updateOrder", gegevens: JSON.stringify (wrap), contentType: "application / json; charset = utf-8", success : function (data) if (data.d === "saved") $ ("

    ") .text (" Nieuwe bestelling opgeslagen! ") .addClass (" succes "). appendTo (" # left "); else $ ("

    ") .text (" Opslaan mislukt ") .addClass (" failure "). appendTo (" # left "););

    Laten we kijken naar wat deze code doet; eerst maken we een aantal variabelen die we later in het script nodig zullen hebben, de eerste is een array letterlijk, de tweede een letterlijk object. We verwijderen vervolgens eventuele succesboodschappen die aanwezig kunnen zijn van eerdere sorteerinteracties. Vervolgens verwerken we elk van de afbeeldingen in het afbeeldingsraster met behulp van jQuery's elk() methode, die de anonieme functie uitvoert die we eenmaal opgeven voor elke afbeelding in de lijst. Deze functie krijgt automatisch een indexnummer doorgegeven voor het huidige item, waar we gebruik van moeten maken.

    Binnen deze functie maken we een nieuw object letterlijk en geven het twee eigenschappen; de ID kaart van de huidige afbeelding en het indexnummer van de huidige afbeelding elk() iteratie. Vervolgens voegen we dit object in de array die we zojuist hebben gemaakt. Zodra we dit voor elke afbeelding op de pagina hebben gedaan, plaatsen we de array in een wikkelobject. Dit object wordt doorgegeven aan de server, wat wordt gedaan met behulp van jQuery's low-level Ajax() methode.

    We moeten het gebruiken Ajax() methode in plaats van, laten we zeggen, de post() of getJSON () methoden, omdat we het moeten specificeren contentType zodat de server de gegevens correct verwerkt. We hebben het verzoektype ingesteld op POST, specificeer het server-side bestand met de naam van de methode die de aanvraag verwerkt als een query string parameter. We geven ook ons ​​voorbereide wrap-object door. Om het object volledig in de JSON-syntaxis om te zetten, gebruiken we het stringify () methode van de json2.js het dossier.

    We specificeren ook een succeshandler die zal worden uitgevoerd zodra het verzoek is voltooid; we kunnen zien dat de tekenreeks wordt geretourneerd door de server door toegang te krijgen tot de gegevens die zijn doorgegeven aan deze succeshandler. De eigenlijke string wordt opgenomen in een artikel van de gegevens object gelabeld d. Gegevens die via AJAX in .Net naar een pagina worden geretourneerd, zijn meestal toegankelijk via een d object op deze manier.

    We kunnen een ander bericht en een andere naam aan de pagina toevoegen, afhankelijk van het feit of de server aangeeft dat het verzoek een succes of mislukking was. Je kunt dit testen en de verschillende berichten bekijken door Firebug te gebruiken om de ID kaart attribuut van een van de afbeeldingscontainers op een waarde die niet bestaat in de database en vervolgens een afbeelding sorteert. Dit is hoe onze berichten zouden moeten verschijnen:


    Het bestand met de actieve servermethode

    Om het JSON-object te ontvangen dat via AJAX aan de server is doorgegeven na een sorteeractie, kunnen we een asmx-bestand gebruiken; Klik met de rechtermuisknop op de hoofdmap van de site in de Solution Explorer en kies Voeg een nieuw item toe. Kies in het dialoogvenster dat verschijnt Webservice in het bovenste gedeelte en Visual C # in de Taal selecteer het vak en klik vervolgens op Toevoegen.

    Dit geeft je een nieuw WebService.asmx bestand op uw site, maar de achterliggende code voor dit bestand gaat naar een automatisch aangemaakte map met de naam App_Code. We hoeven het asmx-bestand helemaal niet bij te werken, alles zal worden gedaan in de achterliggende code WebService.asmx.cs het dossier. Open het en je zult zien dat er al veel code in het bestand zit; verander het zodat het bestand in zijn geheel als volgt wordt weergegeven:

    systeem gebruiken; met behulp van System.Collections.Generic; met behulp van System.Data; met behulp van System.Data.SqlClient; met behulp van System.Linq; met behulp van System.Web; met behulp van System.Web.Services; met behulp van System.Web.Script.Services; ///  /// Ontvangt en slaat nieuwe volgorde van afbeeldingen op ///  [WebServiceBinding (ConformsTo = WsiProfiles.BasicProfile1_1)] // Als u wilt toestaan ​​dat deze webservice vanuit het script wordt aangeroepen met behulp van ASP.NET AJAX, verwijdert u de volgende regel. [System.Web.Script.Services.ScriptService] public class WebService: System.Web.Services.WebService public class ImageDTO public string id get; vast te stellen;  openbare int-bestelling krijg; vast te stellen;  [WebMethod] public string updateOrder (Lijst d) // define connection SqlConnection dbCon = new SqlConnection ("Server = DESKTOP \\ SQLEXPRESS; UID = sa; PWD = your_password; Database = image_organiser"); // verwerk JSON-object foreach (ImageDTO img in d) // define procedure string sSQL = "Update afbeeldingen set [order] =" + img.order + "waarbij id =" + img.id; probeer // open connection dbCon.Open (); // update gegevens cmd.ExecuteNonQuery (); // close connection dbCon.Close ();  catch (SqlException ex) return "failed";  // succes! terug "opgeslagen"; 

    We moeten verschillende naamruimten aan de gebruiksectie boven aan het bestand toevoegen om met onze SQL-database te kunnen werken. We moeten er ook voor zorgen dat we de regel waarop onze webservice wordt aangeroepen vanuit het script op de hoofdpagina van aspx opheffen (het is duidelijk gemarkeerd met een opmerking in de standaardversie van het bestand).

    Binnen de WebService klasse moeten we een nieuwe klasse toevoegen die elk van de binnenste objecten in de array vertegenwoordigt die aan de webservice is doorgegeven. We doen dit met de ImageDTO klasse en geef elk object ID kaart en bestellen eigenschappen en toewijzer getter en setter methoden voor het werken met de waarden van deze eigenschappen.

    Vervolgens komt de methode die wordt aangeroepen vanuit ons script; de order bijwerken web-methode. Deze methode ontvangt de d object dat we casten als een lijst van ImageDTO voorwerpen; we kunnen dan de methoden gebruiken die in onze klasse zijn gedefinieerd om toegang te krijgen tot elke eigenschap.

    We definiëren de verbindingsinformatie die nodig is om verbinding te maken met onze database en verwerken vervolgens elk object in ons ImageDTO-lijst. We extraheren de nieuwe bestelling en de ID kaart van de afbeelding en gebruik deze om de bestellen kolom voor de overeenkomstige rij in de MSSQL-tabel.

    Deze code is relatief vergelijkbaar met de code die we hebben gebruikt om de informatie uit de database te halen bij het laden van de pagina, we gebruiken gewoon een andere verbindingsreeks en gebruiken de ExecuteNonQuery () methode in plaats van ExecuteReader () omdat we de database bijwerken in plaats van er alleen vanaf te lezen. We verpakken ook onze verbindingsuitvoering in a proberen te vangen en voer de tekenreeks uit mislukt of gered afhankelijk van of de update slaagt.


    Samenvatting

    We hebben de c # smaak van .Net gecombineerd met jQuery UI in deze tutorial gebruikt om een ​​pagina te maken die de volgorde van de afbeeldingen erop onthoudt en waarmee de afbeeldingen kunnen worden gerangschikt volgens de grillen en verlangens van de bezoeker van de pagina. In dit voorbeeld is het een eenvoudige pagina, maar vergeet niet dat dit bij een juiste implementatie waarschijnlijk alleen toegankelijk zou zijn voor de geverifieerde gebruiker; elke gebruiker zou toegang hebben tot zijn of haar eigen afbeeldingen en ze kunnen sorteren, terwijl de afbeeldingen zouden worden gerepareerd op de publiek toegankelijke versie van de pagina.

    We hebben geen sanering doorgevoerd van de gegevens die werden doorgegeven aan het bestand aan de serverzijde dat de database bijwerkt; Hoewel de gebruiker de gegevens niet in een tekstveld invoert, kan het uitgaande verzoek van de pagina eenvoudig worden gemanipuleerd om kwaadwillende code naar de server te verzenden. Het gevaar van dit soort aanvallen zou beperkt zijn omdat we waarschijnlijk alleen het sorteren zouden toestaan ​​aan geregistreerde, geauthenticeerde gebruikers. Hoewel beveiliging buiten het bestek van deze zelfstudie valt, zou het altijd een eerste zorg moeten zijn bij het omgaan met live code.