Sende form med Ajax
Hva er Ajax?
Ajax, eller Asynkron JavaScript og XML, er en webutviklingsteknikk for å lage interaktive nettsider. Dette gjøres ved at sidene utveksler litt og litt data med serveren i bakgrunnen, i stedet for å laste hele siden på nytt hver gang brukeren gjør en forandring. Vi bruker ofter jQuery for å skrive Ajax-requests.
Det første vi vil gjøre er å endre slik at skjemaet sendes inn med Ajax. Dette gjør vi i JavaScript som vi legger nederst i Index. Normalt vil vi legge det i en egen fil ettersom det er gunstig med tanke på caching, minification osv, men for denne oppgaven legger vi det bare nederst i Index.cshtml.
<script>var form = $("form"); form.submit(function (e) { // Hindre skjemaet i å sendes inn på vanlig måte e.preventDefault(); // Samle input-dataen i en string var input = form.serialize(); // Hent url fra action-attributten til skjemaet var url = form.attr('action'); // Post skjemaet med ajax $.post(url, input, function (data) { // Sett inn resultatet i div'en med id 'person-info' $('#person-info').html(data); }); });</script>
For at vi skal ha et sted å plassere innholdet må vi pakke inn hele Index.cshtml i en div med en passende id:
<div id="person-info">
<h2>Index
.......
</div>
I tillegg må vi flytte lastningen av jQuery øverst i _Layout.cshtml slik at det er tilgjengelig når html-en lastets. Legg den head under modernir:
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>@ViewBag.Title - My ASP.NET Application</title>
@Styles.Render("~/Content/css")
@Scripts.Render("~/bundles/modernizr")
@Scripts.Render("~/bundles/jquery")
</head>
Vi refresher Index og sender inn skjemaet.
Det funker det, men vi får footeren to ganger. Hmmmm. Vi inspiserer person-info-diven og ser at vi har fått hele skjermbildet på nytt, inkludert menyen, stylesheets, JavaScript - alt som er i _Layout.cshtml.
For å fikse dette må vi gjøre noen grep i PersonController:
[HttpPost]
public ActionResult Create(PersonModel model)
{
if (ModelState.IsValid)
{
if (Request.IsAjaxRequest())
{
return PartialView("Show", model);
}
return View("Show", model);
}
if (Request.IsAjaxRequest())
{
return PartialView("Index", model);
}
return View("Index", model);
}
Vi bygger på nytt og ser at det funker.Det fine nå er at vi ikke behøver å laste hele siden på nytt, så vi sparer trafikk og brukern får rask tilbakemelding. I tillegg har vi fallback hvis JavaScript ikke er på - da fungerer det som før.
<= Tilbake