Dans asp.net-mvc, quel est le meilleur moyen d’avoir un ViewModel de base pour afficher du contenu dynamic sur la page Site.Master

J’ai un site asp.net-mvc et il y a des informations que je veux montrer sur chaque page. J’ai créé une classe appelée BaseViewModel et chacune des classes viewModel hérite de BaseViewModel. La vue Site.Master se lie directement à BaseViewModel.

Actuellement, la classe de base a une propriété appelée MenuLinks.

La propriété menulinks est renseignée à partir d’un appel de firebase database. Ainsi, pour chaque action de contrôleur instanciant un ViewModel, j’ajoute une nouvelle ligne:

viewModel.MenuLinks = _repository.GetMenuLinks(); 

J’ai beaucoup de contrôleurs, d’actions et de modèles de vues. Existe-t-il un moyen plus propre de faire ce qui précède sans avoir à placer cette ligne au-dessus de chaque action du contrôleur

Vous pouvez écrire un atsortingbut de filtre d’action personnalisé à exécuter après chaque action et à définir la propriété du modèle de base:

 public override void OnActionExecuted(ActionExecutedContext filterContext) { base.OnActionExecuted(filterContext); var viewResult = filterContext.Result as ViewResultBase; if (viewResult != null) { var model = viewResult.ViewData.Model as BaseViewModel; if (model != null) { model.MenuLinks = _repository.GetMenuLinks(); } } } 

Maintenant, tout ce qui rest à faire est de décorer votre contrôleur de base avec ce filtre d’action.

Une autre façon de gérer cela consiste à utiliser des actions enfants et à ne pas avoir un modèle de vue de base.

dans votre page site.master, appelez

  

vous pouvez appeler une action dans votre homecontroller si vous le souhaitez et lui demander simplement de renvoyer une vue partielle du code HTML, dans votre cas des liens de menu.

 public class HomeController: Controller { public ViewResult Menu() { var viewModel = new ViewModel(); viewModel.MenuLinks = _repository.GetMenuLinks(); return PartialView("MenuPartial", viewModel); } } 

vous pouvez créer un “MenuPartial.ascx” partiel

 <% foreach(var link in Model.MenuLinks) { %> <%: link.Name %> <% }%> 

J’aime justins exemple car il utilise une approche MVC. Je l’ai modifié pour que cela fonctionne pour MVC3 avec razor. Voici ce que j’ai dans mon _Layout.cshtml:

   

J’ai créé un LayoutController qui a une action de menu comme celle-ci:

 public class LayoutController : Controller { // // GET: /Layout/ public PartialViewResult Menu() { var viewModel = new MenuViewModel {IsAdministrator = true}; return PartialView(viewModel); } } 

Ce qui rend un nom de vue partielle Menu.cshtml

 @model MenuViewModel @if (Model.IsAdministrator) { //render admin stuff } //render other items 

Je pense que le meilleur moyen d’obtenir votre résultat sans modifier toutes les actions de votre contrôleur est de créer un filtre d’action personnalisé qui remplit une propriété de votre modèle de base avec vos liens de menu.

Ensuite, vous pouvez avoir une classe BaseController et append l’atsortingbut à BaseController.

Créez une classe d’usine qui vous donne le modèle de vue déjà configuré.

 Class Factory{ Repository _repository; public Factory(Repository repository){ _repository = repository; } public ViewModel GetViewModel(){ var viewModel = new ViewModel(); viewModel.MenuLinks = _repository.GetMenuLinks(); return viewModel; } } 

dans votre contrôleur, vous pouvez utiliser la classe Factory au lieu de créer directement une instance de viewModel

  ... your controller ... var factory = new Factory(_repository); var viewMolde = factory.GetViewModel();