TOC

This article has been localized into Hungarian by the community.

Modellek:

Nézetmodellek

A tanfolyam során többször is dolgoztunk már modellekkel, de ha más tananyagokat is nézel ASP.NET MVC-ről, vagy csak általánosságban MVC-ről, akkor feltűnhet, hogy gyakran esik szó nézetmodellekről (ViewModel). Mi a különbség modell és nézetmodell közt? Voltaképpen amikor nézetnek adsz egy modellt, akkor nézetmodellnek lehet tekinteni, mivel nézet használja. Más szavakkal, nem feltétlen van különbség - modelljeidet szabadon használhatod nézetmodellként is.

Vannak azonban helyzetek, amikor egy bizonyos nézetnek kifejezetten egy nézetmodellt kellhet írnod. Ez lehet azért, mert egyszerűsíteni vagy bővíteni szeretnél egy létező modellt, vagy mert meg szeretnél jeleníteni valamit egy nézetben amit a modelljeid még nem tartalmaznak.

A nézetmodellek gyakran saját helyet kapnak a projektben, egy "ViewModels" nevű könyvtárban. Ez persze nem kötelező, és mivel a nézetmodellek csak szokványos .NET osztályok, oda teheted őket, ahova csak szeretnéd - érdemes azonban a megszokott módszert használni. Sokan hozzáteszik az osztály nevéhez a ViewModel szót is, például "AddressViewModel" vagy "EditUserViewModel".

Mikor használjunk nézetmodellt?

Íme pár eset amikor előnyödre válhat nézetmodell használata:

Nézetben olyan dolog reprezentálása, amit modell még nem tartalmaz: Amikor modellt adsz egy nézetnek, használhatsz stringet vagy hasonló alap típust, de ha több értéket szeretnél átadni, akkor több értelme lehet egy egyszerű nézetmodell létrehozásának, mint amilyen ez is:

public class AddressViewModel    
{    
public string StreetName { get; set; }    

public string ZipCode { get; set; }    
}

Hozzáférés egy nézeten belül több modell adatához: Ez sok esetben fontos lehet, például ha egy űrlapot kell létrehoznod, amiben több modell adatait lehet szerkeszteni. Ez esetben egy ilyesmi nézetmodellre lehet szükséged:

public class EditItemsViewModel      
{  
public Model1Type Model1 { get; set; }      

public Model2Type Model2 { get; set; }      
}

Létező modell egyszerűsítése: Tegyük fel, hogy van egy hatalmas osztályod, ami tartalmaz minden információt egy felhasználóról. Ez között lehet érzékeny információ, például jelszavak is. Amikor a nézetnek ezt az információt átadod, hasznos lehet, ha csak az a része elérhető, amire ténylegesen szüksége is van. Lehet például egy apró modulod ami mutatja, hogy a felhasználó be van jelentkezve, mi a felhasználóneve és mióta van bejelentkezve. Ez esetben az egész felhasználó modell átadása helyett egy karcsúsított nézetmodellt is átadhatsz, amit külön erre a célra írsz:

public class SimpleUserInfoViewModel   
{
    public string Username { get; set; }

    public TimeSpan LoginDuration { get; set; }  
}

Egy létező modell kiegészítése olyan adattal, ami csak a nézet számára fontos: A másik lehetőség, hogy a modelled pont kevesebb információt tartalmaz, mint amire a nézetnek szüksége lenne. Ez előfordulhat például, ha szeretnél pár kényelmi tulajdonságot vagy metódust írni, amelyek csak a nézet számára relevánsak, a modellnek nem. Az alábbi példában kiterjesztünk egy felhasználó-modellt (WebUser néven) egy LoginDuration (bejelentkezés időtartama) tulajdonsággal, amit a WebUser osztályban már megtalálható LastLogin tulajdonságból számolunk ki:

public class WebUser    
{    
public DateTime LastLogin { get; set; }    
}

Két módja is lehet ennek: vagy ebből a WebUser osztályból eredeztetsz egy újat, vagy hozzáadsz egy tulajdonságot, ami hivatkozik egy WebUser példányra. Utóbbi így néz ki:

public class UserInfoViewModel
{
    public WebUser User { get; set; }

    public TimeSpan LoginDuration
    {
get
{
    return DateTime.Now - this.User.LastLogin;
}
    }
}

A másik:

public class ExtendedUserInfoViewModel : WebUser
{
    public TimeSpan LoginDuration
    {
get
{
    return DateTime.Now - this.LastLogin;
}
    }
}

Összefoglaló

Egy nézetmodell lényegében csupán egy nézetnek adott modell, de ahogy a cikkben látható, több módon is lehet ezt csinálni - vagy egy meglévő modellel, vagy a nézetre testreszabott, újonnan írt modellel.


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!