MVC med Javascript och Ajax. Filip Ekberg

Relevanta dokument
MVC med Javascript och Ajax. Filip Ekberg

MVC med Javascript och Ajax. Filip Ekberg

MVC med Javascript och Ajax. Filip Ekberg

ASP.NET MVC. Copyright Mahmud Al Hakim Innehåll

Asp.net mvc intro PER KVARNBRINK,

E12 "Evil is going on"

TDP013. Webbprogrammering och interaktivitet. AJAX, CORS & jquery. Marcus Bendtsen Institutionen för Datavetenskap (IDA)

Det här dokumentet är till för att ge en översikt över ASP.NET MVC samt hur WCF Services används från.net applikationer.

Appar med ryggrad. Introduktion till JavaScriptramverket Backbone

Räkna med ASP.NET MVC 3

<script src= "

JavaScript in SharePoint and not just for Apps. Wictor Wilén

INTRODUKTION TILL ANGULAR JS

// GET: Test1/Index2 // Syftet är att se hur olika url:er leder till olika actions

JAVASCRIPT. Beteende

EDA095 HTML. Per Andersson. April 26, Lund University Innehåll: HTML, CSS, DOM, JavaScript

Webbprogrammering. Sahand Sadjadee

ASP.NET Web Forms. Copyright Mahmud Al Hakim Vad är Web Forms?

Webbutveckling med AngularJS

Kursplanering Utveckling av webbapplikationer

JavaScript. Innehåll. Historia. Document object model DHTML. Varför Javascript?

Karlstads Universitet, Datavetenskap 1

E12 "Evil is going on"

JavaScript. DOM Scripting

Räkna med ASP.NET Web Forms

Översikt. Installation av EasyPHP 1. Ladda ner från Jag använder Release Installera EasyPHP.

Klient/server. Översikt. Lektion 1: Webbtekniker från Microsoft. Webbteknik från Microsoft. Klient/server. Designmönster. Utrullning.

MVC med Javascript och Ajax. Filip Ekberg

Exemple på Tentauppgifter Webbprogrammering

Introduk+on +ll programmering i JavaScript

Avancerade Webbteknologier

Ajax TruClient. Erfarenheter, tips och trix från Swedbank IT. Christian Gerdes Performance Engineer, LIGHTS IN LINE AB

Webbsidor och webbservrar

E11 "Protection" Föreläsning 11, HT2014 Säkerhet, tillgänglighet. Johan Leitet. Kurs: 1dv403 Webbteknik I

Övning MS SQL och MVC del 2

E13 "Behind the Wild"

Webbtjänster med API er

1ME323 Webbteknik 3 Lektion 6 API. Rune Körnefors. Medieteknik Rune Körnefors

TDP013 Node.js, JSCoverage, Mocha. Marcus Bendtsen Institutionen för Datavetenskap

JavaScript. En Introduktion

Labora&on 8 Formulär övningar/uppgi6er

Webbprogrammering - 725G54 PHP. Foreläsning II

Mål med lektionen! Repetera och befästa kunskaperna.

En integration av betalningssystem på hemsida

! HTML Formulär! JavaScript! Syntax! Events! DOM. ! URL variabler i en query string (get) ! HTTP post request (post)

Webbteknik II. Föreläsning 5. Restless farewell. John Häggerud, 2011

Innehåll. Dokumentet gäller från och med version

PHP. Dynamiska webbsidor

HTML och CSS. Eric Elfving Institutionen för Datavetenskap (IDA)

Arbeta med databas. Översikt. Lektion 1: Arbeta med Entity Data Models. Arbeta med Entity Data Models. LINQ (Language Integrated Query).

E07 "Greased Lightning"

Programmeringteknik. Planering MÅL LABB: MOMENT LAB4 HTML - EXEMPEL HTML. Webbdelen

JS & beteende. TNMK30 - Elektronisk publicering

F8 Webbteknologier 2. PHP PHP: Hypertext Preprocessor

Webbteknik. Innehåll. Historisk återblick Teknisk beskrivning Märkspråk Standardisering Trender. En kort introduktion

Android översikt. TDDD80 Mobila och sociala applikationer

Services + REST och OAuth

F8 Webbteknologier 2. EDA095 Nätverksprogrammering. Roger Henriksson Datavetenskap Lunds universitet

Lektion 2, Grundläggande funktioner i ASP.NET

Föreläsning 4. CSS Stilmallar för webben

On-line produktion TDDC61

Installationsanvisningar VisiWeb. Ansvarig: Visi Closetalk AB Version: 2.3 Datum: Mottagare: Visi Web kund

Webbteknik II. Föreläsning 4. Watching the river flow. John Häggerud, 2011

Repetition. Hypertext. Internet HTTP. Server och klient Text försedd med länkar till andra texter. Många sammankopplade nät

Repetition. Hypertext. Internet HTTP. Server och klient Föreläsning 2. Text försedd med länkar till andra texter. Många sammankopplade nät

JavaScript. JavaScript Ramverk (Bibliotek) jquery + jquery UI

Lektion 5 HTML, CSS, PHP och MySQL

Modern webbutveckling. av Robert Welin-Berger

E09 - Totally Tool Time

JAVASCRIPT-POWERED LOADRUNNER CHRISTIAN GERDES PERFORMANCE ENGINEER LIGHTS IN LINE AB

F8 Webbteknologier 1. Dynamiska webbsidor

DOM (Document Object Model) är modellen efter vilken en webbläsaren är uppbyggd. Alla objekt/element i webbläsaren finns hierarkiskt ordnade i DOM.

Systemutvecklare SU14, Malmö

För att öppna galleriet, ange adressen

Inspirationsdel Bygghemma.se

Tips & Trix - Teknik Jeeves World Copyright 2011 Jeeves Information Systems AB

ASP.NET Thomas Mejtoft

F06 A table form Dagens agenda

I den här labben ska vi använda oss av en trevlig nyhet i HTML5: Local Storage, för att implementera en sorts lokal gästbok.

Grundläggande programmering med C# 7,5 högskolepoäng

729G28. Webbprogrammering och databaser. Introduktion till webbutveckling med PHP. Jakob Pogulis Institutionen för Datavetenskap (IDA)

ASP.NET Web Pages. Copyright Mahmud Al Hakim Först lite Classic ASP :-)

Objektorienterad Programmering (OOP) Murach s: kap 12-16

MVC med Javascript och Ajax. Filip Ekberg

TDP013. Node.js, Mocha, Istanbul. Anders Fröberg Institutionen för Datavetenskap

Labora&on 2 HTML och validering övningar/uppgi:er

HTML. Introduktion till HyperText Markup Language

Modul 8 Hantering av indata

Webbservrar, severskript & webbproduktion

Sammanfattning. Applikationen är utvecklad i Microsofts utvecklingsmiljö Visual Studio 2012.

Android fortsättning. TDDD80 Mobila och sociala applikationer

Labora&on 1 Variabler och beräkningar övningar/uppgi9er

On-line produktion TDDC61

Prova på-laboration i PHP Johan Sjöholm johsj@ida.liu.se Institutionen för datavetenskap, Linköpings universitet

TNMK30 - Elektronisk publicering

Lite mer om CGI-programmering

Viktigt! Glöm inte att skriva TentamensKod (ditt anonyma student-id) på alla blad du lämnar in.

Language Integrated Query, LINQ, och databaser

Labora&on 7 Syfte med laborationen:

PHP - Fortsättning. PHP och MySQL

Transkript:

MVC med Javascript och Ajax Filip Ekberg

MVC med Javascript och Ajax Lektion 3 & 4 - Javascript & Ajax

Vad ska vi lära oss? I denna kurs lär sig den studerande hur man jobbar med den naturliga uppdelningen av data, GUI och logik i sina projekt. Detta görs med MVC som är ett ramverk. MVC har mer eller mindre blivit en standard för avancerade.net-webbsidor. Arbetssättet gör att koden blir mer återanvändbar och kostnadseffektiv. Man delar upp projektet i de logiska lagren i Modell, View och Controller. Varje logiskt lager kan ersättas av en ny modul för att skapa en helt ny applikation.

Vad ska vi lära oss? Skapa projekt i ramverket ASP.NET MVC Projektstruktur i Visual Studio Model-View-Controller: Lagerstruktur och concept Designmönster & Arkitektur Integrering av databas och Entity Framework Lägga till och modifiera: Layout, Controllers, Razor Views JavaScript, Ajax Säkerhet & Infrastruktur

Bildgalleri? Ladda upp bilder Skapa album av uppladdade bilder Kommentera på bilder Inloggning & Säkerhet Administrationsgränssnitt

mail@filipekberg.se

Hur har det gått? Vad är svårast att förstå?

Dagens mål Repetition Vad är MVC? Hur hänger det ihop med ASP.NET? Hur bygger jag ett MVC-projekt? HTTP Hur funkar egentligen GET, POST, PUT, DELETE? När använder man vilken och hur funkar en webbserver? Hur skiljer sig server-kod från kod som exekveras på klienten? Vad är JavaScript och jquery Hur kommer vi igång med klient-programmering? Vad är Asynkron Programmering? Vad är Ajax? GET, POST via Ajax Hur hanterar vi svar från servern via GET/POST med JavaScript? Hur manipulerar vi DOM?

MVC

Var ska min logik vara?

Undvik logik i vyer! (Det finns undatag)

Löst Kopplat

Var ska jag hantera var bilden sparas?

MVC Busines-lager Data-lager Controller Action View View Model Integrations Domain Validation Domain Model Repositories Entity Framework Data Model

Hur lätt är de för mig att byta ut ett lager nu?

HTTP

Hur funkar en webserver?

Hur funkar en webserver? Webbläsare www.microsoft.com 191.239.213.197:80 IIS HTML

Hur vet webbservern vad som ska hända?

HTTP

Ett protokoll för hur webben fungerar

www.mygallery.com/gallery Path HTTP Version HTTP Verb GET /Gallery HTTP/1.1 Host: www.mygallery.com:80 Adressen för webbservern

www.mygallery.com/gallery?id=1 Query String GET /Gallery?id=1 HTTP/1.1 Host: www.mygallery.com:80

GET /Gallery HTTP/1.1 Host: www.mygallery.com <!DOCTYPE html> <html> <head> <meta name="viewport" content="width=device-width" /> <title>my Gallery</title> </head> <body> <div> <h2>this is my gallery page</h2> </div> </body> </html>

ASP.NET MVC

GET /Gallery?id=1 HTTP/1.1 Host: www.mygallery.com IIS www.mygallery.com:80 ASP.NET Routing Mappa /Gallery till rätt Controller & Action Mappa värden till parametrar (ingående modell) Rendera vyn

GET /Gallery?id=1 HTTP/1.1 Host: www.mygallery.com public class GalleryController : Controller { public ActionResult Index(int id) { return View(); } }

GET /Gallery?id=1 HTTP/1.1 Host: www.mygallery.com public class MyModel { public int Id { get; set; } } public class GalleryController : Controller { public ActionResult Index(MyModel model) { var idfrommodel = model.id; } } return View(); ASP.NET skapar en instans av MyModel och sätter Id

POST HTTP Version HTTP Verb Path Query String POST /Gallery/Add?name=my+gallery+name HTTP/1.1 Host: www.mygallery.com:80 Adressen för webbservern

POST /Gallery/Add?name=my+gallery+name HTTP/1.1 Host: www.mygallery.com:80 public class GalleryController : Controller { [HttpPost] public ActionResult Add(MyModel model) { return RedirectToAction("Index"); } public class MyModel { public string Name { get; set; } } } public ActionResult Index() { return View(); } Det skapas automatiskt upp en instans av MyModel där Name är satt till my gallery name

<form action="/gallery/add" method="post"> <input type="text" name="name"/> <input type="submit"/> </form> public class GalleryController : Controller { [HttpPost] public ActionResult Add(MyModel model) { return RedirectToAction("Index"); } public class MyModel { public string Name { get; set; } } } public ActionResult Index() { return View(); } Det skapas automatiskt upp en instans av MyModel där Name är satt till värdet av input-fältet.

POST JSON Data som servern ska ta emot POST /Gallery/Add HTTP/1.1 Host: www.mygallery.com:80 Content-Type: application/json Hur ska servern tolka det vi skickar in? Body { } "name" : "my gallery name"

POST /Gallery/Add HTTP/1.1 Host: www.mygallery.com:80 Content-Type: application/json { } "name" : "my gallery name" public class GalleryController : Controller { [HttpPost] public ActionResult Add(MyModel model) { return RedirectToAction("Index"); } public class MyModel { public string Name { get; set; } } } public ActionResult Index() { return View(); } Det skapas automatiskt upp en instans av MyModel där Name är satt till my gallery name

https://www.asp.net/media/4773381/lifecycle-of-an-aspnet-mvc-5-application.pdf

GET är för att läsa Inga sidoeffekter

POST är för lägg till

DELETE?

Delete DELETE /Gallery/Delete/1 HTTP/1.1 Host: www.mygallery.com:80 [HttpDelete] public ActionResult Delete(int id) { }

PUT?

JavaScript

Vad är skillnad på kod som körs i webbläsaren och på webbservern?

ASP.NET körs på servern kommer aldrig åt något på användarens dator

JavaScript körs i webbläsaren

Isolerad miljö Begränsat vad du kommer åt

JavaScript är inte statiskt typat Dynamiskt programmeringsspråk

Bygg smarta klienter med hjälp av JavaScript

Jobba med DOM Document Object Model

F12 för att öppna Developer Console i Chrome

Dela upp logik för olika sidor i olika JavaScript filer

<!DOCTYPE html> <html> <head> <meta name="viewport" content="width=device-width" /> <title>@viewbag.title</title> </head> Lägg till JavaScript sist! <body> <div> @RenderBody() </div> <script src="/scripts/gallery.js"></script> <script src="/scripts/main.js"></script> </body> </html>

<head> <meta name="viewport" content="width=device-width" /> <title>@viewbag.title</title> <script type="text/javascript"> </script> </head> if (window.location.href == "http://fekberg.com/") { alert("hello there!"); }

Vad bör vi använda JavaScript till?

Validering

Redirects location.href = "http://www.google.com";

Notifieringar Growl

Smarta klienter

SPA Single Page App

Vänta på att DOM laddats?

(function() { })(); Kör funktionen

Lägg på Id för att komma åt via JavaScript lättare <form id="form" action="/gallery/add" method="post"> <input type="text" name="name" id="name"/> <input type="submit" /> </form> Lägg på Id för att komma åt via JavaScript lättare

<form id="form" action="/gallery/add" method="post"> <input type="text" name="name" id="name"/> <input type="submit" /> </form> (function() { })(); var form = document.getelementbyid("form");

var form = document.getelementbyid("form"); form.addeventlistener("submit", function (e) { }); Registrera en event handler För eventet submit Inline-funktion som körs när eventet sker

function (e) { Information om eventet, och hjälpmedel för att påverka vad som sker härnest! e.preventdefault(); var galleryname = document.getelementbyid("name"); alert(galleryname.value); Kör inte det inbyggda flödet för vad som sker när jag submittar ett formulär posta alltså inte det till servern! <input type="text" name="name" id="name"/> } Hämta värdet på vår input

@model Photo @{ } ViewBag.Title = $"Du tittar på {Model.Name}"; <a class="delete" href="/delete/" data-imageid="@model.id">delete @Model.Name</a>

var deletelink = document.getelementsbyclassname("delete")[0]; Leta efter ett element med CSS-klassen delete. OBS: Det kan finnas fler! Registrera vad som händer vid eventet click Inline-funktion som körs när eventet sker deletelink.addeventlistener("click", function(e) { });

function (e) { e.preventdefault(); Information om eventet, och hjälpmedel för att påverka vad som sker härnest! Vi vill inte navigera någonstans när vi klickar på länken! var imageid = this.getattribute("data-imageid"); } alert(imageid); this pekar på anchor, alltså länken! data-imageid="@model.id"

(function () { var t1 = this; deletelink.addeventlistener("click", function (e) { })(); }); var t2 = this; OLIKA!

<a class="delete" href="/delete/" data-imageid="1">delete Swimming with Sharks</a> <a class="delete" href="/delete/" data-imageid="2">delete Sunset at the Beach</a>

var links = document.getelementsbyclassname("delete"); for (var i = 0; i < links.length; i++) { Alla länkarna med klassen delete links[i].addeventlistener("click", function (event) { event.preventdefault(); Lägg på en event-listener på samtliga länkar alert(this.getattribute("data-imageid")); }); }

var number = 0; var numberstring = "0"; alert(number == numberstring); alert(number === numberstring);

var number = 0; var numberstring = ""; alert(number == numberstring); alert(number === numberstring);

Du kommer jobba mycket med if / else for switch document getelement* Olika events

Vad händer om jag stänger av JavaScript?

JavaScript Cheat Sheet https://www.cheatography.com/davechild/cheat-sheets/javascript/

MVC med Javascript och Ajax Lektion 4 - Javascript & Ajax Fortsätter

Dagens mål Vad är JavaScript och jquery Hur kommer vi igång med klient-programmering? Vad är Asynkron Programmering? Vad är Ajax? GET, POST via Ajax Hur hanterar vi svar från servern via GET/POST med JavaScript? Hur manipulerar vi DOM? Validering - Automatisk & Manuell validering på klientsidan Validering - Server- eller Klient-validering? Ramverk för att underlätta smarta klienter SPA (Single Page Apps) Hantera uppdatering av segment i DOM Hantera fel Jobba med JSON

jquery

Ett bibliotek för att göra det enklare att jobba med JavaScript och DOM https://jquery.com/

Allt går att göra UTAN jquery!

Extremt mycket tredjeparts-komponenter!

Kör via CDN

Install-Package jquery /// <reference path="jquery-3.1.1.intellisense.js" />

$

Prefix för att använda jquery Selector Vad är det vi använder jquery mot? $(document)

Kan skriva jquery istället för $ Selector Vad är det vi använder jquery mot? jquery(document)

Använd jquery för att hantera elementet med id myid $("#myid").hide(); Action Vad är det vi vill göra?

Använd jquery för att hantera elementet med klassen myid $(".myid").show(); Action Vad är det vi vill göra?

Använd jquery för att hantera ALLA div-element $("div").hide(); Action Vad är det vi vill göra?

Använd jquery för att hantera alla länkar Iterera över alla länkar Inline-funktion som tar vilket index samt element i listan av länkar $("a").each(function(index, element) { }); alert(element); Visa en alert-box med länken

Använd jquery för att hantera document $(document).ready(function() { }); Action Vad är det vi vill göra?

(function () { })(); var deletelink = document.getelementsbyclassname("delete")[0]; deletelink.addeventlistener("click", function (e) { }); CSS-selector för att hämta första elementet med klassen delete $(document).ready(function() { $(".delete:first").click(function(event) { event.preventdefault(); }); }); alert($(this).attr("data-imageid")); Använd jquery för elementet vi får ett click-event för Detta för att vi kan använda t.ex. attr, hide, show, etc

Manipulera DOM

$('div').each(function (index, element) { $(this).html('<strong>' + $(this).html() + '</strong>'); });

<div id="test">alright!</div> $("div#test").html(); $("div#test").html("<strong> " + $("div#test").html() + "</strong>");

<div> <span>title</span> <div class="content">content</div> </div> var parent = $('div.content').parent(); var span = parent.children("span:first"); span.html("<h1>" + span.html() + "</h1>");

jquery Validation

install-package jquery.validation install-package Microsoft.jQuery.Unobtrusive.Validation

<input class="valid" data-val="true" data-val-required="the Name field is required." id="name" name="name" type="text" value="" data-cip-id="name" aria-required="true" aria-describedby="name-error" aria-invalid="false">

<input class="input-validation-error" data-val="true" data-val-required="the Name field is required." id="name" name="name" type="text" value="" data-cip-id="name" aria-required="true" aria-describedby="name-error" aria-invalid="true">

$("form").submit(function (e) { var form = $(this); form.validate(); }); if (!form.valid()) { e.preventdefault(); }

public class Photo { public Guid Id { get; set; } } [Required] public string Name { get; set; }

Server-validering

[HttpPost] public ActionResult Index(Photo model) { if (ModelState.IsValid) { // Add photo } } return View(model);

Använd båda!

Tips på vad du kan göra Hitta närliggande element Sök efter element i hela DOM:en Ta bort, Lägg till och Ändra innehåll Lägg till och Ta bort klasser Fade In/Out Timer Kör något regelbundet AJAX

jquery Cheat Sheet https://oscarotero.com/jquery/

Mer JavaScript

function Photo(name) { this.name = name; this.id = null; } var photo = new Photo("test"); console.log(photo.name);

NodeJS Inget vi kommer använda i denna kursen

MVC/MVVM på klienten

Olika ramverk för att göra det enklare att bygga smarta klienter

Client-side - JavaScript Serverside - ASP.NET MVC / MVVM MVC Busines-lager Data-lager View Model Bindings Controllers Actions Controller Action View View Model Integrations Domain Validation Domain Model Repositories Entity Framework Data Model

MVC eller MVVM?

Model View ViewModel

Automatiska bindningar i JavaScript

Ta hjälp av ramverk

Angular Kraftfult, Vedertaget och bra Men svårt att komma igång

Vue.js

Components istället för Controllers Samma koncept olika namn

<script src="https://unpkg.com/vue/dist/vue.js"></script>

<div id="app"> </div> {{ message }}

var app = new Vue({ el: '#app', data: { message: 'Hello Vue!' } });

var app = new Vue({ el: '#app', data: { message: 'Hello Vue!', somemessage: Detta laddades in ' + new Date() } });

<span v-bind:title="somemessage"> Hover your mouse over me for a few seconds to see my dynamically bound title! </span>

<ol> <li v-for="todo in todos"> {{ todo.text }} </li> </ol>

var app = new Vue({ el: '#app', data: { message: 'Hello Vue!', todos: [ { text: 'Lära oss MVC' }, { text: 'Lära oss JavaScript' }, { text: 'Lära oss Säkerhet' } ] } });

<div id="app"> {{ message }} <button v-on:click="reversemessage"> Reverse Message </button> </div>

var app = new Vue({ el: '#app', data: { message: 'Hello Vue!' }, methods: { reversemessage: function() { this.message = this.message.split('').reverse().join('') } } });

<div id="app"> {{ message }} <input v-model="message"> <button v-on:click="reversemessage"> Reverse Message </button> </div>

https://vuejs.org

Enklare att få en bra arkitektur för klient-kod

Inte ett krav för labbarna!

Client-side - JavaScript Serverside - ASP.NET MVC / MVVM MVC Busines-lager Data-lager View Model Bindings Controllers Actions Controller Action View View Model Integrations Domain Validation Domain Model Repositories Entity Framework Data Model

Asynkron Programmering

Något som sker samtidigt som nuvarande exekvering utan att låsa applikationen!

Undvik att låsa applikationen

Synkront är blockerande Asynkront är icke-blockerande

Gör X åt mig när du är klar säg till

Exempel Användaren Laddar upp en bild Webbsidan visar en spinner Användaren får reda på att bilden sparats

Utan att sidan laddades om!

Vad händer om de tar för lång tid?

AJAX

Asynchronous JavaScript and XML

XMLHttpRequest

var request = new XMLHttpRequest(); Förbered för en ny AJAX request request.addeventlistener("load", function(e) { alert(this.responsetext); }); Vad händer när vi får ett svar? request.open("get", "/Gallery/Info"); Vad ska vi anropa? request.send(); Skicka iväg vår request

public class Photo { public Guid Id { get; set; } public string Name { get; set; } } public class GalleryController : Controller { } [HttpPost] public ActionResult Add(Photo model) { return Content($"Added {model.name}"); }

var model = { id : "bcf54577-600a-4813-b026-838ff385d3af", name : "Sunset at the beach" }; var request = new XMLHttpRequest(); request.addeventlistener("load", function(e) { alert(this.responsetext); }); request.open("post", "/Gallery/Add"); request.setrequestheader("content-type", "application/json;charset=utf-8"); request.send(json.stringify(model));

Användaren klickar på Delete Visa en laddnings-indikation för användaren Skicka iväg ett anrop i bakgrunden mot servern Du har fått svar! Ta bort laddnings-indikatorn och hantera svaret Webbservern hanterar anropet

jquery + AJAX

$.ajax({ type: "GET", url: url, data: data, success: success, datatype: datatype });

$.ajax({ type: "GET", url: "/Gallery/Info", success: function(data) { alert(data); } });

$.get("/gallery/info", function(data) { }); alert(data);

$.ajax({ type: "POST", url: url, data: data, success: success, datatype: datatype });

$.ajax({ type: "POST", url: "/Gallery/Add", data: JSON.stringify(model), success: function(data) { alert(data); }, error: function(data) { Skicka modellen som JSON Hantera ett svar }); Det är JSON vi skickar }, contenttype: "application/json; charset=utf-8", datatype: "text" Vad för data får vi tillbaka?

JSON

[HttpPost] public ActionResult Add(Photo model) { model.name = "Test"; return Json(model); }

$.ajax({ type: "POST", url: "/Gallery/Add", data: JSON.stringify(model), success: function(data) { model.id = data.id; model.name = data.name; }, Svaret parsas automatiskt från JSON contenttype: "application/json; charset=utf-8", datatype: "json" }); Hantera svaret som JSON

$.post("/gallery/add", model, function (data) { alert(data.name); }); Case-sensetive! Svaret har deserialiserats från JSON automatiskt

$.post("/gallery/add", ); $("form").serialize(), function (data) {} Serialisera formuläret och skicka med AJAX-anropet

function Photo(name) { this.name = name; this.id = null; } var photo = new Photo("test"); console.log(photo.name); console.log(json.stringify(photo))

Ladda upp fler filer

<input type="file" id="files" name="files" multiple="multiple" />

[HttpPost] public ActionResult Index(HttpPostedFileBase[] files) { foreach (var file in files) { file.saveas(server.mappath($"~/uploads/{file.filename}")); } }

var form = document.getelementbyid("form"); var xhr = new XMLHttpRequest(); xhr.open("post", form.action); xhr.send(new FormData(form));

var form = document.getelementbyid("form"); $.ajax({ url: form.action, data: new FormData(form), type: 'POST', }); // Nedan måste sättas för att det ska fungera! contenttype: false, processdata: false

Byta ut DOM-element

[HttpPost] public ActionResult Index(HttpPostedFileBase[] files) { foreach (var file in files) { file.saveas(server.mappath($"~/uploads/{file.filename}")); } } return PartialView("Success", files.select(x => x.filename));

var xhr = new XMLHttpRequest(); xhr.onloadend = function (e) { $("#result").html(this.responsetext); } xhr.open("post", formelement.action); xhr.send(new FormData(formElement));

Labb 2

Fortsätt med Bildgalleriet Controllers & Actions för att kommentera på individuella bilder samt album Controller & Action för att skapa ett album där man kan välja en samling av de bilderna som laddats upp Validering vid samtliga POST-anrop samt använda AntiForgeryTokens(Attribut) för samtliga POST-anrop Alla POST-anrop ska ske via AJAX tänk på att inte låta användaren trycka på samma knapp flera gånger, undvik att låta användaren dubbelposta Alla AJAX-anrop ska vara korrekt felhanterade och felmeddelanden ska presenteras till användaren snyggt Du ska kunna blädda bland bilder i ett fotoalbum utan att göra en postback, d.v.s. utnyttja AJAX för att ladda in nästa bild och presentera den Vid varje AJAX-anrop ska du visa en laddnings-indikation för användaren Du ska automatiskt hämta nya kommenterar på bilder var 10:e sekund Om du öppnar två webbläsare och kommenterar på samma bild, ska båda klienterna få bådas kommentarer utan att behöva ladda om webbsidan

Skickas in på Torsdag!

mail@filipekberg.se

Håll följande i åtanke Håll din Controller liten Håll dina Views rena Dela upp i Partial Views Använd dig av Layout Undvik ViewBag om du inte behöver den Validera formulärdata Visa laddnings-indikation för klienten Sköt alla POST via AJAX

Skicka Github länk för review! Skicka en Github-länk till labben Jag återkommer med feedback och förbättringsförslag