108 votes

ASP.NET MVC Razor passer le modèle à la mise en page

Ce que je vois, c'est une propriété de disposition de chaîne. Mais comment puis-je passer explicitement un modèle à la propriété Layout ?

4voto

Laz Ziya Points 686

Vieille question mais juste pour mentionner la solution pour les développeurs MVC5, vous pouvez utiliser l'option Model propriété identique à celle de la vue.

En Model dans la vue et la disposition est associée à la même propriété. ViewDataDictionary vous n'avez donc pas à faire de travail supplémentaire pour transmettre votre modèle à la page de présentation, et vous n'avez pas à déclarer les objets @model MyModelName dans la mise en page.

Mais remarquez que lorsque vous utilisez @Model.XXX dans la mise en page, le menu contextuel intelliSense n'apparaîtra pas parce que le bouton Model est un objet dynamique, tout comme ViewBag .

3voto

computrius Points 348

Peut-être que ce n'est pas techniquement la bonne façon de procéder, mais la solution la plus simple et la plus raisonnable pour moi est de créer une classe et de l'instancier dans le layout. Il s'agit d'une exception ponctuelle à la bonne manière de procéder. Si vous le faites plus souvent que dans le layout, vous devez sérieusement repenser ce que vous faites et peut-être lire quelques tutoriels de plus avant d'avancer dans votre projet.

public class MyLayoutModel {
    public User CurrentUser {
        get {
            .. get the current user ..
        }
    }
}

puis dans la vue

@{
    // Or get if from your DI container
    var myLayoutModel = new MyLayoutModel();
}

dans .net core, il est même possible de sauter cette étape et d'utiliser l'injection de dépendances.

@inject My.Namespace.IMyLayoutModel myLayoutModel

C'est l'une de ces zones qui est plutôt ombragée. Mais compte tenu des solutions extrêmement compliquées que je vois ici, je pense qu'il s'agit d'une exception plus qu'acceptable au nom de l'aspect pratique. Surtout si l'on veille à rester simple et à s'assurer que toute logique lourde (je dirais qu'il ne devrait pas y en avoir, mais les exigences diffèrent) se trouve dans une autre classe/couche, là où elle doit se trouver. C'est certainement mieux que de polluer TOUS vos contrôleurs ou modèles pour le bien d'une seule vue

2voto

Clark Kent Points 5845

Il existe une autre façon de l'archiver.

  1. Juste implémenter la classe BaseController pour tous les contrôleurs .

  2. Dans le cadre de la BaseController créer une méthode qui renvoie une classe de modèle, comme par exemple.

public MenuPageModel GetTopMenu() 
{    

var m = new MenuPageModel();    
// populate your model here    
return m; 

}
  1. Et dans le Layout vous pouvez appeler cette méthode GetTopMenu()
@using GJob.Controllers

<header class="header-wrapper border-bottom border-secondary">
  <div class="sticky-header" id="appTopMenu">
    @{
       var menuPageModel = ((BaseController)this.ViewContext.Controller).GetTopMenu();
     }
     @Html.Partial("_TopMainMenu", menuPageModel)
  </div>
</header>

1voto

Arun Prasad E S Points 3375

Comme ci-dessus seulement, mais avec une mise en œuvre simple

Page d'index

@model CMS.Models.IndexViewModel 

@{
    ViewBag.PageModel = Model;    
}

Page de présentation

@{
    var Model = (CMS.Models.IndexViewModel)ViewBag.PageModel;        
}

0voto

e4rthdog Points 881

Pour compléter la réponse de @Mattias Jakobsson, voici le lien qui explique pourquoi nous devrions utiliser RenderAction pour les pages de mise en page.

Quand utiliser Html.RenderPartial et Html.RenderAction dans les vues Razor de ASP.NET MVC ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X