TOC

This article has been localized into Hungarian by the community.

Razor:

Séma-delegáltak

A Razor séma-delegált funkcionalitásával olyan markup sémát definiálhatsz, amivel egy bizonyos objektumot könnyebben reprezentálhatsz egy nézetben. Ez olyankor hasznos eszköz, amikor például egy osztályod példányait több helyen szeretnéd megjelentetni egy nézetben. Abban is segít, hogy nagyobb markup részeket elválassz a nézet logikájától. Ez megkönnyíti hosszabb nézetek értelmezését és karbantartását.

Séma-delegáltak definiálásakor egy Func delegáltat kell használnod - egy lehetséges módja ennek:

Func<dynamic, object> movieTemplate = @<div>@item.Title [@item.ReleaseDate.ToShortDateString()]</div>;

Az egyenlőségjel előtt deklarálom a movieTemplate delegáltat, utána pedig megadom a használandó markup sémát. Figyeld, hogyan használom a item változót - ez a delegáltba kerül paraméterként. Mivel ennek a típusa dynamic, ezért olyan tagokhoz is hozzáférhetek (pl. Title), amelyek fordításkor nem lesznek ellenőrizve. Ehelyett ezek futáskor vannak hitelesítve, ahol feltételezett, hogy valóban léteznek is az objektumon - ha nem, hibát kapunk! Én Movie típusú objektumokat szeretnék használni, amit korábban már használtunk:

public class Movie
{
    public string Title { get; set; }
    public DateTime ReleaseDate { get; set; }
}

Most, hogy a séma-delegáltunk a helyén van, használhatjuk például egy cikluson belül. Alább látható, hogy most már ahelyett, hogy a cikluson belül markupot definiálnék, egyszerűen a delegáltnak adom a Movie objektumaimat:

@foreach(var movie in movies)
{
    @movieTemplate(movie)
}

Ha feltöltjük a movies gyűjteményt pár tesztbejegyzéssel, akkor az eredmény így mutat:

<div>The Godfather [24-03-1972]</div>
<div>Forrest Gump [06-07-1994]</div>
<div>Fight Club [15-10-1999]</div>

Itt pedig egy teljes példa, némi tesztadattal együtt, amivel kísérletezhetsz:

@using HelloMVCWorld.Models
@{
    ViewData["Title"] = "TemplatedDelegate";

    Func<dynamic, object> movieTemplate = @<div>@item.Title [@item.ReleaseDate.ToShortDateString()]</div>;

    List<Movie> movies = new List<Movie>();
    movies.Add(new Movie() { Title = "The Godfather", ReleaseDate = new DateTime(1972, 3, 24) });
    movies.Add(new Movie() { Title = "Forrest Gump", ReleaseDate = new DateTime(1994, 7, 6) });
    movies.Add(new Movie() { Title = "Fight Club", ReleaseDate = new DateTime(1999, 10, 15) });

}

@foreach(var movie in movies)
{
    @movieTemplate(movie)
}

Összefoglalás

A Razor séma-delegált szintaxisa megkönnyíti a markup-alapú sémák létrehozását, amiket aztán nézeteidben többször is újrahasználhatsz.


This article has been fully translated into the following languages: Is your preferred language not on the list? Click here to help us translate this article into your language!