Formattering med annoteringer
Den enkleste måten for oss å tvinge fødselsdato-feltet til å vises uten klokkeslett er å annotere feltet i PersonModel:
[DataType(DataType.Date)]
public DateTime? DateOfBirth { get; set; }
Det finnes mange andre datatyper vi kan benytte oss av, feks CreditCard, EmailAddress eller Currency. Disse gjør ikke validering, kun formattering av visningen.
For enkelhets skyld setter vi fødselsdatoen i Show-metoden på PersonController
public ActionResult Show(int id = 1)
{
var model = new PersonModel(id, "Nils", "Jensen", "9161166")
{
DateOfBirth = new DateTime(1987,06,06)
};
return View(model);
}
slik at vi slipper å fylle ut skjemaet hver gang. Vi bygger på nytt og går til /Person/Show.
Klokkeslettet vises fremdeles, hvorfor det?
I Show.cshtml spytter vi bare ut C#-verdien. Vi kunne skrevet @Model.DateOfBirth.Value.ToShortDateString() men det er dumt av to grunner:
- Det vil feile (NullReferenceException) hvis DateOfBirth ikke er satt.
- Hvis vi ønsker å endre det må vi gjøre det hvert eneste sted vi viser en DateTime
Løsningen er å bruke en Html helper for visningen:
@Html.DisplayFor(m => m.DateOfBirth)
Det er ansett som beste praksis å alltid bruke denne hjelperen for å vise datafelter fra modellen.
Imens vi er igang innser vi at det er dumt å hardkode navnene også, vi vil heller bruke navnene fra modellen:
@Html.DisplayNameFor(m => m.DateOfBirth)
Show.cshtml ser nå slik ut:
@model MVCintro.Models.PersonModel
<h2>Person</h2>
<p>@Html.DisplayNameFor(m => m.Id): @Html.DisplayFor(m => m.Id)</p>
<p>@Html.DisplayNameFor(m => m.FirstName): @Html.DisplayFor(m => m.FirstName)</p>
<p>@Html.DisplayNameFor(m => m.LastName): @Html.DisplayFor(m => m.LastName)</p>
<p>@Html.DisplayNameFor(m => m.PhoneNumber): @Html.DisplayFor(m => m.PhoneNumber)</p>
<p>@Html.DisplayNameFor(m => m.IdentityNumber): @Html.DisplayFor(m => m.IdentityNumber)</p>
<p>@Html.DisplayNameFor(m => m.DateOfBirth): @Html.DisplayFor(m => m.DateOfBirth)</p>
<p>@Html.DisplayNameFor(m => m.EmailAddress): @Html.DisplayFor(m => m.EmailAddress)<</p>
Vi refresher skjermbildet og verifiserer at det virker.
<= Tilbake