Podczas budowania formularzy często potrzebujemy wyświetlić zbiory danych. Załóżmy, że mamy klasę Contact zawierającą dane kontaktowe użytkownika (email, telefon, fax). W celu wyświetlenia informacji zawartych w klasie można oczywiście użyć zwykłych wywołań Html.Label np:
<p>Phone:</p><%=Model.Contact.Phone%>
<p>Email:</p><%=Model.Contact.Email%>
<p>Fax:</p><%=Model.Contact.Fax%>
Metoda całkowicie poprawna jednak bardzo niewygodna – co jeśli do klasy dodamy nowe pole, np. MobilePhoneNumber? Oczywiście programista będzie musiał modyfikować kod – mało interesująca opcja. Na szczęście ASP .NET MVC dostarcza funkcję Display, która wyświetli wszystkie właściwości:
<%=Html.Display("Contact")%>
ViewData[“Contact”] musi zawierać oczywiście instancję klasy Contact:
Contact contact = new Contact();
contact.Email = "contact@live.com";
contact.Fax = "252525";
contact.Phone = "45353";
ViewData["Contact"] = contact;
Dla ścisłości dołączam jeszcze deklarację Contact:
[MetadataType(typeof(Contact_Metadata))]
public class Contact
{
public string Phone { get; set; }
public string Fax { get; set; }
public string Email { get; set; }
}
Warto zwrócić uwagę na atrybut MetadataType. Dzięki niemu możemy zdefiniować właściwości pól (długość, typ itp):
internal class Contact_Metadata
{
[Required(ErrorMessage = "Phone is required.")]
public string Phone { get; set; }
[Required(ErrorMessage = "Fax is required.")]
public string Fax { get; set; }
[Required(ErrorMessage = "Email is required.")]
[StringLength(200, ErrorMessage = "Email must be 200 characters or less.")]
[RegularExpression(@"\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*", ErrorMessage = "Valid Email Address is required.")]
[DataType(DataType.EmailAddress)]
public string Email { get; set; }
}
Jak wspomniałem Html.Display wyświetli wszystkie pola klasy:
Na tym jednak nie koniec zalet płynących z wykorzystania Display. Można definiować własne szablony dla poszczególnych pól. Szablony w formie widoków częściowych należy umieszczać w folderze DisplayTemplates np:
Przykładowy szablon dla pola Email (dodaje element graficzny):
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<string>" %>
<a href="mailto:<%= Html.DisplayFor(emailaddress => emailaddress) %>">
<%= Html.DisplayFor(emailaddress => emailaddress) %>
</a>
<img src="/Content/email.gif" />
W analogiczny sposób można definiować szablony dla całej klasy Contact a nie tylko dla poszczególnych pól. W tym celu dodajemy widok częściowy Contact.ascx i umieszczamy go również w DisplayTemplates:
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<MvcApplication2.Contact>" %>
<p>
<%= Html.LabelFor(c => c.Phone)%>:
<%= Html.DisplayFor(c => c.Phone)%>
</p>
<p>
<%= Html.LabelFor(c => c.Email) %>:
<%= Html.DisplayFor(c => c.Email) %>
</p>
<p>
<%= Html.LabelFor(c => c.Fax) %>:
<%= Html.DisplayFor(c => c.Fax) %>
</p>