ASP.NET MVC: Předání dat z kontroleru do pohledu

V předchozím článku o ASP.NET MVC jsem se zabýval předáváním dat při přesměrování, ale jak ukázaly dotazy na oficiálním fóru, lidé častou tápou v tom, jak správně dělat pro MVC naprosto zásadní věc – předat data z kontroleru do pohledu. Není to nic složitého, tak na to rychle mrkneme.

Základní struktura, která k předávání dat z kontroleru do pohledu slouží, je property ViewData kontroleru, která je typu ViewDataDictionary, což je jen Dictionary<string, object> doplněný o property Model typu object. Hodnotu této property můžeme nastavit také prostřednictvím parametru model metody View kontroleru.
V pohledu pak máme opět k dispozici ViewData a to i stejného typu. Data tedy můžeme předat jednoduše tak, že něco nastavíme v kontroleru a v pohledu si to přečteme:

ViewData["Title"] = "Home Page";
ViewData["Message"] = "Welcome to ASP.NET MVC!"; 

Jak vidno, není to zrovna nejbezpečnější cesta. Ve stringu se dá jednoduše udělat těžko odhalitelný překlep a navíc ukládaná hodnota je typu object, takže při jejím čtení je nutné provést přetypování, což je další možný zdroj ošklivých problémů.
Proto je lepší si vytvořit jednoduchou třídu, která bude obsahovat všechna, která potřebujeme předávat:

public class HomeIndexModel
{
    public string Title { get; set; }
    public string Message { get; set; }
} 

Při volání metody View pak použijeme instanci této třídy jako parametr model:

return View(new HomeIndexModel { Title = "Home Page", Message = "Welcome to ASP.NET MVC!" }); 

Nyní předáváme data sice silně typově, ale v pohledu (reprezentovaném třídou ViewPage) stále máme ViewData.Model typu object, takže bychom opět museli provádět přetypování. Jak z toho ven? V ASP.NET MVC Beta musíme otevřít code-behind soubor pohledu (.aspx.cs) a přepsat předka z ViewPage na ViewPage<HomeIndexModel>. Pak bude ViewData.Model v pohledu typu HomeIndexModel.
V release verzi ASP.NET MVC už pohledy nebudou mít code-behind (jsou to skutečně jen aspx soubory, není žádný přidružený aspx.cs), takže stačí napsat generického předka do úvodní Page direktivy, konkrétně využít Inherits atribut (jak ukazuje ScottGu).

Zanechat odpověď

Vyplňte detaily níže nebo klikněte na ikonu pro přihlášení:

Logo WordPress.com

Komentujete pomocí vašeho WordPress.com účtu. Odhlásit /  Změnit )

Google+ photo

Komentujete pomocí vašeho Google+ účtu. Odhlásit /  Změnit )

Twitter picture

Komentujete pomocí vašeho Twitter účtu. Odhlásit /  Změnit )

Facebook photo

Komentujete pomocí vašeho Facebook účtu. Odhlásit /  Změnit )

Připojování k %s

Tento web používá Akismet na redukci spamu. Zjistěte více o tom, jak jsou data z komentářů zpracovávána.