MVC med Javascript och Ajax. Filip Ekberg

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

MVC med Javascript och Ajax. Filip Ekberg

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

Asp.net mvc intro PER KVARNBRINK,

MVC med Javascript och Ajax. Filip Ekberg

MVC med Javascript och Ajax. Filip Ekberg

Övning MS SQL och MVC del 2

MVC med Javascript och Ajax. Filip Ekberg

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.

Räkna med ASP.NET MVC 3

MVC med Javascript och Ajax. Filip Ekberg

Labb 3: ASP.NET 4.5 Anpassningar av användargränssnittet: Master Pages, Teman, och Kontroller

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

Appar med ryggrad. Introduktion till JavaScriptramverket Backbone

Räkna med ASP.NET Web Forms

Kursplanering Utveckling av webbapplikationer

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

ASP.NET Thomas Mejtoft

Lab 6: ASP.NET 2.0 Providermodellen

INTRODUKTION TILL ANGULAR JS

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

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

F06 A table form Dagens agenda

Webbprogrammering. Sahand Sadjadee

Webbtjänster med API er

21/01/2016. Stilmallar. styra utseendet av webbplatsen DEL 1. Karin Fahlquist. index.html. recept.html frukt.html grönsaker.html

<script src= "

Lektion 2 - CSS. CSS - Fortsätt så här

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

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

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

Tentamen ITK:P2. Inga hjälpmedel tillåtna förutom penna och papper. Skriv tydligt och texta gärna. 14 st frågor, 70 poäng.

JAVASCRIPT. Beteende

Karlstads Universitet, Datavetenskap 1

Android fortsättning. TDDD80 Mobila och sociala applikationer

Language Integrated Query, LINQ, och databaser

DB, DATA, LOGIC, EXPOSURE (WEB)

TNMK30. Elektronisk publicering

Services + REST och OAuth

Introduk+on +ll programmering i JavaScript

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

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

TNMK30 Elektronisk publicering HT 2014 Laboration 5: PHP och MySQL

En integration av betalningssystem på hemsida

HTML och CSS. Eric Elfving Institutionen för datavetenskap. 18 augusti 2015

Viva la evolución. Peter Backlund

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

Android översikt. TDDD80 Mobila och sociala applikationer

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

WEBDESIGN A - DTR 1210

Sidan kommer inte läggas upp någonstans utan du redovisar den för mig på något handledningstillfälle.

JS & beteende. TNMK30 - Elektronisk publicering

PHP. Dynamiska webbsidor

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

MVC-mönster i ASP.NET Projektblogg bygghemma.se

Innehåll Introduktion... 3 InteractiveScene.config... 3 Scener <scenes>... 3 Typsnitt <fonts>... 3 Övergångar <transitions>...

Webbutveckling med AngularJS

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

Namn: (Ifylles av student) Personnummer: (Ifylles av student) Tentamensdatum: Tid: Hjälpmedel: Inga hjälpmedel

2I1073 Lektion 2. Lektion 2a. Lektion 2a. Servlets, säkerhet, och filhantering. import java.io.*; import javax.servlet.*; import javax.servlet.http.

PHP. PHP: Hypertext Preprocessor

Användarmanual för. 1(1)

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

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

F12 - Collections. ID1004 Objektorienterad programmering Fredrik Kilander

WEBDESIGN A - DTR 1210

Avancerade Webbteknologier

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

JavaScript. En Introduktion

Spelprogrammering med JavaScript och HTML5

Lektion 2, Grundläggande funktioner i ASP.NET

TDDD52 CSS. Färger. Färger 1/3/13

Innehåll. dynamisk bindning. och programmering CRC) u Arv, polymorfi och

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

Labb 1: Skapa en webbsite

Internet A. HTML Grunder Maximilien Chiang 1

Schenker Privpak AB Telefon VAT Nr. SE Schenker ABs ansvarsbestämmelser, identiska med Box 905 Faxnr Säte: Borås

E12 "Evil is going on"

Lösningar till tentamen i EDAF25

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

Essential Php Security Författare: Shiflett, Chris Antal sidor: 124 Förlag: O'Reilly

Lektion 3 HTML, CSS och JavaScript

F4. programmeringsteknik och Matlab

Lab 5: ASP.NET 2.0 Site Navigation

Lab 5: ASP.NET 4.5 Site Navigation

Föreläsning 7. Träd och binära sökträd

Upplägg. Introduktion. Examination. Mål. Konsekvenser. Java. Kursen heter konstruktion, ej design eller formgivning.

E02 "The Review" Föreläsning 2, HT2013 Grunderna, repetition. Johan Leitet. Kurs: 1dv403 Webbteknik I

Webbsidor och webbservrar

DAT043 Objektorienterad Programmering

F07 Stilmallar Dagens agenda

Tentamen Programmeringsteknik II Skrivtid: Hjälpmedel: Java-bok (vilken som helst) Skriv läsligt! Använd inte rödpenna!

Outline. Objektorienterad Programmering (TDDC77) En frukt har ett namn. Man kan lägga en frukt i en korg... Hashing. Undantag. Ahmed Rezine.

Objektorienterad Programmering (TDDC77)

Labb 3: ASP.NET 2.0 Anpassningar av användargränssnittet: Master Pages, Teman, och Kontroller

Webbprogrammering - 725G54 PHP. Foreläsning II

HTML. Introduktion till HyperText Markup Language

Det finns en referensbok (Java) hos tentavakten som du får gå fram och läsa men inte ta tillbaka till bänken.

Användarbeskrivning för Anvisningstjänsten

Tänk på följande: Det finns en referensbok (Java) hos tentavakten som du får gå fram och läsa men inte ta tillbaka till bänken.

Transkript:

MVC med Javascript och Ajax Filip Ekberg

MVC med Javascript och Ajax Lektion 2 - Introduktion Fortsätter

Dagens mål GET, POST - Hur sätter vi upp en action för respektive? Modell-bidningar, Modell-validering Razor, Areas, Sections, Layouts, Views, Jobba med data, ViewBag Felhantering Kompilerade vyer Web.config HTML Helpers Publicering

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

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

MVC

Var ska min logik vara?

Undvik logik i vyer! (Det finns undatag)

Löst Kopplat

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

Titta på template-koden!

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

HTTP Verbs GET, POST, PUT, DELETE,

JSON

[ ] { } "Id": "3c744db6-a16c-4709-802d-7e171a5669b3", "Name": "Filip Ekberg"

public class AccountController : Controller { private static IList<Account> accounts = new List<Account>(); public ActionResult Index() { return Json(accounts, JsonRequestBehavior.AllowGet); } [HttpPost] public ActionResult Create(Account account) { if(accounts.any(x => x.name == account.name)) { return new HttpStatusCodeResult(400, "Kontot finns redan"); } account.id = Guid.NewGuid(); accounts.add(account); } } return Json(account);

View Engines

View Engines Razor & ASPX

Razor Enkelt att lära sig Enkelt att blanda in C# i vyerna utan att de blir kladdigt Följer med ASP.NET MVC razorcheatsheet.com

ViewBag?

<!DOCTYPE html> <html> <head> <title>@viewbag.title</title> </head>

ViewBag är dynamic

Razor & C#

@{ } var names = new[] {"Filip", "Sofie"}; foreach (var name in names) { <h1>@name</h1> }

@{ var firstname = "Filip"; var lastname = "Ekberg"; <h1>@firstname</h1> } <h2>@lastname</h2>

@{ var firstname = "Filip"; var lastname = "Ekberg"; } <h2>@($"{firstname} {lastname}")</h2>

@{ } var html = "<h1>filip</h1>"; @html

@{ } var html = "<h1>filip</h1>"; @Html.Raw(html)

@{ } var html = "<h1>filip</h1>"; @:test @Html.Raw(html)

@{ } string style = null; <div style="@style">test!</div>

@{ } string style = "color: #ccc;"; <div style="@style">test!</div>

Layout

Layout Ligger i Views\Shared Kan sättas per vy Du kan ha fler Layouts för ditt projekt Default sätts i _ViewStart

_ViewStart @{ } Layout = "~/Views/Shared/_Layout.cshtml";

<!DOCTYPE html> <html> <head> <title>@viewbag.title - My ASP.NET Application</title> </head> <body> <div class="container body-content"> @RenderBody() <hr /> @RenderPage("Footer.cshtml") </div> @RenderSection("Scripts", false) <script src="~/scripts/jquery-1.10.2.min.js"></script> <script src="~/scripts/bootstrap.min.js"></script> </body> </html>

HTML Helpers

HTML Helpers Stöd för ofta använda funktioner Enkelt att lägga till egna vid behov techbrij.com/notes/aspnet-mvc-4.php

HTML Helpers Html.AntiForgeryToken Html.AttributeEncode Html.Encode Html.Raw Html.Partial Html.Action Html.RenderAction Html.ActionLink Html.BeginForm Html.CheckBox Html.EndForm Html.Hidden Html.ListBox Html.Password Html.RadioButton Html.DropDownList Html.TextArea Html.TextBox Html.ValidationSummary Html.ValidationMessage Html.RouteLink

public static class MyHtmlHelper { public static IHtmlString Scream(this HtmlHelper helper, string input) { return helper.raw($"<h1>{input}</h1>"); } } @Html.Scream("Tests")

@helper HelperName(string name) { <h1>@name</h1> } @MyHelper.HelperName("Test")

Partial Views & Pages

En vy renderad i en annan vy

public ActionResult Profile() { return PartialView("PartialProfile", new Profile()); }

<!DOCTYPE html> <html> <head> <title>min Layout</title> <link href="~/styles/site.css" rel="stylesheet" type="text/css" /> </head> <body> @RenderPage("~/Shared/Header.cshtml") <div id="main"> @RenderBody() </div> <div id="footer"> 2016 Filip. All rights reserved. </div> </body> </html>

@model List<ApiDemo.Controllers.Profile> @{ } ViewBag.Title = "Profiles"; @foreach (var profile in Model) { Html.RenderPartial("Profile", profile); }

Sections

<!DOCTYPE html> <html> <head> <title>@viewbag.title - My ASP.NET Application</title> </head> <body> <div class="container body-content"> @RenderBody() <hr /> @RenderPage("Footer.cshtml") </div> @RenderSection("Scripts", false) <script src="~/scripts/jquery-1.10.2.min.js"></script> <script src="~/scripts/bootstrap.min.js"></script> </body> </html>

Areas

Organisera relaterad funktionalitet

Man kan ha olika rättigheter!

Attributes

[HttpGet] public ActionResult Profile() { } [HttpPost] public ActionResult Profile(string name) { } [HttpDelete] public ActionResult Profile(Guid id) { }

[Authorize] public class ProfileController : Controller { }

[OutputCache(Duration = 10)] public ActionResult Profile() { }

Formulär

@using (Html.BeginForm()) { @Html.AntiForgeryToken() }

<form action="/photo/create" method="post"> <input name=" RequestVerificationToken" type="hidden" value="vl..." /> </form>

@using (Html.BeginForm( "Create", "Photo", FormMethod.Post, new {enctype = "multipart/form-data"})) { }

<form action="/photo/create" enctype="multipart/form-data" method="post"> <input name=" RequestVerificationToken" type="hidden" value="vl..." /> </form>

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

public ActionResult Create() { return View(); } <input type="file" name="file" id="file" /> [HttpPost] public ActionResult Create(Photo photo, HttpPostedFile file) { file.saveas( Path.Combine(Server.MapPath("~/Photos"), file.filename)); } return View();

<configuration> <system.web> <httpruntime maxrequestlength="1048576" /> </system.web> </configuration> <system.webserver> <security> <requestfiltering> <requestlimits maxallowedcontentlength="1073741824" /> </requestfiltering> </security> </system.webserver>

Scaffolding

Bundling

Minska antalet requests mot vår webbtjänst

Minska storleken på den totala dataöverföringen (Minification)

public static void RegisterBundles(BundleCollection bundles) { bundles.add(new ScriptBundle("~/bundles/jquery").Include( "~/Scripts/jquery-{version}.js")); bundles.add(new ScriptBundle("~/bundles/jqueryval").Include( "~/Scripts/jquery.validate*")); bundles.add(new ScriptBundle("~/bundles/modernizr").Include( "~/Scripts/modernizr-*")); bundles.add(new ScriptBundle("~/bundles/bootstrap").Include( "~/Scripts/bootstrap.js", "~/Scripts/respond.js")); } bundles.add(new StyleBundle("~/Content/css").Include( "~/Content/bootstrap.css", "~/Content/site.css"));

Hantera olika resultat

Resultat från en Action ActionResult ContentResult EmptyResult FileContentResult FilePathResult FileResult FileStreamResult HttpNotFoundResult HttpStatusCodeResult HttpUnauthorizedResult JsonResult JavaScriptResult PartialViewResult RedirectResult RedirectToRouteResult ViewResult

Modell-hantering

Modell-bindning

public class Photo { public Guid Id { get; set; } public string Name { get; set; } public string Url { get; set; } public string Path { get; set; } public long Size { get; set; } }

[HttpGet] public ActionResult Create(string name, string url, string path, long size) { return Json(new Photo { Id = Guid.NewGuid(), Name = name, Url = url, Path = path, Size = size }, JsonRequestBehavior.AllowGet); }

http://localhost:60146/photo/create?name=name&url=url&path=path&size=100 { } "Id": "f97ec982-c862-463d-af5e-244a3133744e", "Name": "name", "Url": "url", "Path": "path", "Size": 100

[HttpPost] public ActionResult Create(string name, string url, string path, long size) { }

[HttpPost] public ActionResult Create(Photo photo) { }

Hur kommer jag åt modellen i min vy?

public ActionResult Index() { var photosmodels = new List<Photo>(); var photos = Directory.GetFiles(Server.MapPath("~/Photos")); foreach (var photo in photos) { var info = new FileInfo(photo); } photosmodels.add(new Photo { Name = info.name, Path = $"/Photos/{info.Name}", Size = info.length }); } return View(photosModels);

@model IEnumerable<ApiDemo.Models.Photo> @foreach (var item in Model) { }

<th> @Html.DisplayNameFor(model => model.name) </th> @foreach (var item in Model) { <td> <img src="@item.path" width="300" /> </td> }

Modell-validering

[HttpPost] public ActionResult Create(Photo photo, HttpPostedFileBase file) { if (!ModelState.IsValid) { return View(photo); } if (file == null) { ModelState.AddModelError("error", "Ingen bild?"); } return View(photo); file.saveas(path.combine(server.mappath("~/photos"), file.filename)); } return View();

@Html.ValidationSummary(true, "", new { @class = "text-danger" }) <div class="form-group"> @Html.LabelFor(model => model.name, htmlattributes: new { @class = "control-label col-md-2" }) <div class="col-md-10"> @Html.EditorFor(model => model.name, new { htmlattributes = new { @class = "form-control" } }) @Html.ValidationMessageFor(model => model.name, "", new { @class = "text-danger" }) </div> </div> <div class="form-group"> <label class="control-label col-md-2" for="photo">photo</label> <div class="col-md-10"> <input type="file" name="file" id="file" /> @Html.ValidationMessage("error") </div> </div> <div class="form-group"> <div class="col-md-offset-2 col-md-10"> <input type="submit" value="create" class="btn btn-default" /> </div> </div>

public class Photo { public Guid Id { get; set; } [Display(Name = "Bildnamn")] [StringLength(20, ErrorMessage = "Fyll i ett namn", MinimumLength = 3)] public string Name { get; set; } } public string Url { get; set; } public string Path { get; set; } public long Size { get; set; }

Hantera fel

Överraskningsfel

<customerrors mode="on" defaultredirect="/home/error" /> public class HomeController : Controller { public ActionResult Error() { return View(); } }

protected void Application_Error() { Response.Redirect("/Home/Error"); }

Hantera modell-fel i Controllern

Inställningar i Web.config

Web.config

<appsettings> <add key="mysetting" value="somevalue" /> </appsettings> ConfigurationManager.AppSettings["MySetting"]

Kompilerade Vyer

Vad händer idag om vi har syntax-error i Razor?

Få kompileringsfel vid syntax-error i Razor!

Lite segare att starta..

<MvcBuildViews>true</MvcBuildViews>

<Target Name="MvcBuildViews" AfterTargets="AfterBuild" Condition="'$(MvcBuildViews)'=='true'"> <AspNetCompiler VirtualPath="temp" PhysicalPath="$(WebProjectOutputDir)" /> </Target> <Target Name="AfterBuild" Condition="'$(Configuration)'!='Debug'"> <RemoveDir Directories="$(BaseIntermediateOutputPath)" /> </Target>

Publicera till IIS

Publicera till Azure

Skapa gratiskonto och testa!

Tips & Trix

Web Essentials

Browser Link

Route Debugger http://haacked.com/archive/2008/03/13/url-routing-debugger.aspx

Fortsätta med Labben

Fortsätt med Bildgalleriet Ladda upp bilder Skapa album av uppladdade bilder Kommentera på bilder Inloggning & Säkerhet Administrationsgränssnitt

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

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