Lage Action for å ta imot skjema
For å sende inn data må vi først ha en metode som kan ta det imot. Vi oppretter en ny Action på PersonController som vi kaller Create. Ettersom det er vanlig å bruke POST som http-metode for når man sender inn data markerer vi metoden med [HttpPost].
[HttpPost]
public ActionResult Create(PersonModel model)
{
return View("Show", model);
}
Vi tar inn et objekt av typen PersonModel som argument. For å vise hva vi får inn bruker vi et View vi allerede har: Show.cshtml.
Lage skjema
For å lage skjemaet har vi en ny samling med Html-hjelpere. Vi setter også modellen til Index til å være av typen PersonModel. Index.cshtml:
@model MVCintro.Models.PersonModel
@{
ViewBag.Title = "Index";
}
<h2>Index</h2>
@Html.ActionLink("Link 1", "Show", new { @id = 13 }, new { @class="pull-right", id = "iden-til-linken" })
<a href="@Url.Action("Show", new {@id = 13})">Link 2
@using (Html.BeginForm("Create", "Person")){
@Html.TextBoxFor(m => m.FirstName)<br/>
@Html.TextBoxFor(m => m.LastName)<br />
@Html.TextBoxFor(m => m.PhoneNumber)<br />
<input type="submit" value="Send inn" />
}
Vi bygger på nytt (CTRL + F5) og vips så har vi et skjema. Når vi forsøker å sende inn får vi denne feilmeldingen:
PersonModel. Siden browseren ikke kan sende C#-objekter, er det MVC-rammeverket som må opprette objektet utifra parameterene som kommer inn med POST-requesten fra skjemaet. For at det skal klare å opprette et nytt objekt må PersonModel ha en tom konstruktør. Vi går til PersonModel.cs og legger til en konstruktør:public class PersonModel
{
public PersonModel(int personId, string firstName, string lastName, string phoneNumber)
{
Id = personId;
FirstName = firstName;
LastName = lastName;
PhoneNumber = phoneNumber;
}
public PersonModel()
{
}
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string PhoneNumber { get; set; }
}
Vi bygger på nytt, og vips får kan vi sende inn informasjon om personen som vises på Show-siden vår.
Skjemaet funker ok, men det er litt dumt at vi ikke har noen merkelapper på feltene - det er jo umulig for brukeren å vite hva feltene er til. Vi legger til labels:
@using (Html.BeginForm("Create", "Person")){
@Html.LabelFor(m => m.FirstName)
@Html.TextBoxFor(m => m.FirstName)<br/>
@Html.LabelFor(m => m.LastName)
@Html.TextBoxFor(m => m.LastName)<br />
@Html.LabelFor(m => m.PhoneNumber)
@Html.TextBoxFor(m => m.PhoneNumber)<br />
<input type="submit" value="Send inn" />
}
Vi har nå beskrivende felter, men vi skulle ønske at de var på norsk. Vi kunne skrevet html-merkelappen selv, men det er dumt hvis vi senere vil ha de på flere språk. Vi velger derfor heller å legge på visningsnavnet på feltene i PersonModel:
public int Id { get; set; }
[DisplayName("Fornavn")]
public string FirstName { get; set; }
[DisplayName("Etternavn")]
public string LastName { get; set; }
[DisplayName("Telefonnummer")]
public string PhoneNumber { get; set; }
<= Tilbake