Si vous préférez que vos vues aient des classes de données de vue fortement typées, cela peut fonctionner pour vous. D'autres solutions sont probablement plus correctes mais c'est un bel équilibre entre le design et l'aspect pratique à mon humble avis.
La page maître prend une classe de données de vue fortement typée contenant uniquement des informations pertinentes:
public class MasterViewData
{
public ICollection<string> Navigation { get; set; }
}
Chaque vue utilisant cette page maître utilise une classe de données de vue fortement typée contenant ses informations et dérivant des données de vue des pages maîtres:
public class IndexViewData : MasterViewData
{
public string Name { get; set; }
public float Price { get; set; }
}
Puisque je ne veux pas que les contrôleurs individuels sachent quoi que ce soit sur la compilation des données des pages maîtres, j'encapsule cette logique dans une usine qui est transmise à chaque contrôleur:
public interface IViewDataFactory
{
T Create<T>()
where T : MasterViewData, new()
}
public class ProductController : Controller
{
public ProductController(IViewDataFactory viewDataFactory)
...
public ActionResult Index()
{
var viewData = viewDataFactory.Create<ProductViewData>();
viewData.Name = "My product";
viewData.Price = 9.95;
return View("Index", viewData);
}
}
L'héritage correspond au maître pour bien visualiser la relation, mais quand il s'agit de rendre les partiels / contrôles utilisateur, je vais composer leurs données de vue dans les données de vue des pages, par exemple
public class IndexViewData : MasterViewData
{
public string Name { get; set; }
public float Price { get; set; }
public SubViewData SubViewData { get; set; }
}
<% Html.RenderPartial("Sub", Model.SubViewData); %>
Ceci est un exemple de code uniquement et n'est pas destiné à être compilé tel quel. Conçu pour ASP.Net MVC 1.0.