TOC

This article has been localized into Hungarian by the community.

Nézetek:

Adat hozzáadása a nézethez

Egy nézet létezhet modell vagy bármi egyéb adat nélkül is, de a legtöbb esetben szükséged van arra, hogy a nézetből hozzáférj a vezérlőben rendelkezésre álló adatokra. Mivel a nézetednek nem szabadna tudnia a vezérlődről (az egy felelősség elve szerint), ezért a vezérlő feladata, hogy ellássa a megfelelő adatokkal a nézetet. Két lehetőségünk van erre: vagy egy erősen típusos modellt írsz, és ezt adod a nézetnek, vagy a ViewData/ViewBag konténereket használod. Ezeket a megközelítéseket vesszük alább szemügyre.

Figyelem: lesz némi átfedés ez a cikk és a korábban szereplő gyorstalpaló cikk között, amiben egy modellt adtunk projektünkhöz.

(Nézet)modell használata

Mivel a technológiát MVC-nek, vagy Model-View-Controllernek nevezik, egy (nézet)modell használata a legtisztább és leggyakrabb módja az adatátadásnak. Későbbi leckében még foglalkozunk a modellekkel, egyelőre legyen elég annyi, hogy többnyire pusztán egy objektumról van szó, ami általában valami valóságbeli dolgot képez le. Találkozhatsz a "nézetmodell", View Model fogalmával is - ezzel is később foglalkozunk, de röviden fogalmazva a nézetmodell egy modell, amit nézetnek adunk. Lehet ez valami ami már létezik a projektben, például egy User vagy Product objektum, de akár egy olyan osztály is, amit kifejezetten azért írsz, hogy a nézetben megjelenítendő adatokat magába foglalja.

Egy modellnek nem kell azonban komplex osztálynak lennie - elméletben lehet olyan egyszerű is mint egy String, egy Integer, vagy egy DateTime. Bármi ami a .NET keretrendszerben megtalálható használható mint modell, de a gyakorlatban a modelljeid olyan osztályok lesznek, amelyek legalább egy pár tulajdonsággal rendelkeznek. Például, egy terméket jelképező modell lehet valami ilyesmi:

public class Product
{
public string Title { get; set; }

public double Price { get; set; }
}

A modell és a nézet közti kapcsolatot a vezérlő alakítja ki - ami vehet például bemenetet a felhasználótól, és azt a nézet számára fontos adattá alakíthatja. Itt egy példa:

public IActionResult Details(int id)
{
Product product = new Product()
{
Title = "Toilet Paper",
Price = 1.99
};
return View(product);
}

Fontos, hogy a product példányt a nézetnek adom amikor a View() metódust használom. A Product/Details nézetben a fájl első sorában így most megadhatom a Product osztályt mint modellt a @model direktíva használatával:

@model HelloMVCWorld.Models.Product

Most hogy ez kész, használhatod a (nézet)modelledet és tulajdonságait a nézetedben:

@model HelloMVCWorld.Models.Product

<h1>@Model.Title</h1>
Price: @Model.Price

Ennek az erősen típusos modelldeklarációnak köszönhetően az IntelliSense-en keresztül segítséget kapsz, amikor a modellosztály tagjaihoz szeretnél hozzáférni, és a fordítás (build) során hitelesítve lesz a kódod, ezzel biztosítva hogy csak olyan tulajdonságokat/metódusokat használtál, amelyek a modellen valóban léteznek.

Dinamikus nézetek

Ha nem deklarálsz modell típust a nézetednek az @model direktíva segítségével, akkor a nézet nem fog konkrét típusú modellel számolni. Ez persze nem akadályoz meg abban hogy bármilyen típusú objektumot adj és használj a nézeten belül. Az ilyen nézetekre gyakran dinamikus nézetként hivatkoznak. Nem használják őket túl sűrűn, mivel ezzel elvesznek az IntelliSense-támogatás és a fordítás során történő ellenőrzés előnyei.

Ha vennéd a fenti példát és törölnéd az @model direktívát az első sorban, a nézet ugyanúgy működne továbbra is. Ebben az esetben a Model tulajdonság dinamikus objektumnak vehető, aminek a tulajdonságaihoz szabadon hozzáférhetsz anélkül, hogy a fordító ellenőrizné létezésüket. Ez persze azzal is jár, hogy ha nem létező tulajdonsághoz próbálsz hozzáférni, akkor futáskor az oldalgenerálás hibát fog eredményezni. Emiatt nem sűrűn használunk dinamikus nézeteket.

A ViewData/ViewBag konténerek használata

Az erősen típusos megközelítés helyett használhatjuk a ViewData/ViewBag konténereket is. Ezekhez bármit adhatsz a vezérlőben, amihez aztán a nézetből automatikusan hozzáférsz. Könnyen használható, és majdnem mindent elérhetsz vele, mint egy erősen típusos modellel is. Például:

public IActionResult DetailsViewData(int id)
{
ViewBag.ProductTitle = "Toilet Paper";
ViewBag.ProductPrice = 1.99;
return View();
}

Így könnyen hozzáférsz ehhez az adathoz a nézetedben, köszönhetően a mindig rendelkezésre álló ViewBag tulajdonságnak:

<h1>@ViewBag.ProducTtitle</h1>
Price: @ViewBag.ProductPrice

A fő különbség, hogy nincs fordításkori ellenőrzés, és az IntelliSense sem segít a kód írásakor. Ez azt jelenti, hogy ha véletlen elírod a tulajdonság nevét, azt lehet, hogy csak akkor veszed észre, amikor élesben használnád a nézetet. Emiatt érdemes csak kis mennyiségű adatra használni a ViewData/ViewBaget. Fontos viszont tudni, hogy kombinálhatod a ViewData/ViewBag használatát egy hagyományos, típusjelölt modellel.

Mi a különbség a ViewData és a ViewBag közt?

Feltűnt már valószínűleg hogy két fogalmat használok a dinamikus adatátadás használatára: a ViewData és ViewBag tulajdonságokat. Ezek voltaképpen ugyanarra a dologra hivatkoznak, méghozzá egy kulcsokból és értékekből álló szótárra. Mivel azonban a ViewBag egy szótár DynamicObject reprezentációja, ezért kulcs megadása helyett úgy férhetsz hozzá a benne lévő értékekhez, mintha azok tulajdonságok lennének. A ViewData és ViewBag tulajdonságokat egymásnak megfelelően használhatod, mivel mindig ugyanarra az adatgyűjteményre hivatkoznak. Összehasonlítás gyanánt itt egy példa, ahol mindkettőt használjuk:

Vezérlő:

public IActionResult DetailsViewData(int id)
{
ViewData["ProductTitle"] = "Toilet Paper";
ViewBag.ProductPrice = 1.99;
return View();
}

Nézet:

<h1>@ViewData["ProducTtitle"]</h1>
Price: @ViewBag.ProductPrice

Mint látható, a ProductTitle olvasása és írásakor egy ViewData tulajdonságot használom, ami a szótár szintaxis használatát igényli, míg a ProductPrice-hoz való hozzáféréskor a pont operátort használom a ViewBagen. Ez pár kisebb különbséget is jelent, például megállapíthatom, hogy egy bizonyos kulcs-érték pár létezik-e a ViewData gyűjteményben (a ContainsKey() metódus használatával). Végső soron azonban az a legfontosabb, hogy a neked legjobban tetsző megközelítést válaszd, és a következetesség érdekében végig annál is maradj.

Összefoglaló

Többféle megközelítés alapján adhatsz adatot a nézetnek a vezérlőből, de javasolt az erősen típusos modellek használata, amikkel pontosan megadhatod, milyen típusú modellre számítson a nézet. Ez lehetővé teszi az IntelliSense használatát és a használt metódusok és tulajdonságok fordításkori ellenőrzését.


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!