135 votes

Transmettre des données à la mise en page qui sont communes à toutes les pages

J'ai un site web qui a une page de mise en page. Cependant, cette page de mise en page contient des données que toutes les pages doivent fournir, comme le titre de la page, le nom de la page et l'emplacement où nous nous trouvons actuellement pour une aide HTML que j'ai créée et qui effectue une action. De plus, chaque page a ses propres propriétés de modèle de vue.

Comment puis-je faire cela ? Il semble que ce ne soit pas une bonne idée de taper une mise en page mais comment puis-je passer ces informations ?

12 votes

Pour tous ceux qui lisent les réponses ici, veuillez voir stackoverflow.com/a/21130867/706346 où vous verrez une solution beaucoup plus simple et plus propre que tout ce qui a été posté ici.

5 votes

@AvrohomYisroel bonne suggestion. Cependant, je préfère l'approche de @Colin Bacon parce qu'elle est fortement typée et qu'elle n'est pas dans l'approche de la ViewBag . Peut-être une question de préférences. J'ai quand même upvoted votre commentaire

0 votes

Pour mvc 5 voir cette réponse : stackoverflow.com/a/46783375/5519026

-1voto

Asad Ali Points 107

Au lieu de passer par là vous pouvez toujours utiliser une autre approche qui est également rapide.

créer une nouvelle vue partielle dans le répertoire partagé et appeler votre vue partielle dans votre mise en page en tant que

@Html.Partial("MyPartialView")

dans votre vue partielle, vous pouvez appeler votre base de données et faire ce que vous voulez.

@{
    IEnumerable<HOXAT.Models.CourseCategory> categories = new HOXAT.Models.HOXATEntities().CourseCategories;
}

<div>
//do what ever here
</div>

en supposant que vous avez ajouté votre base de données Entity Framework

-1voto

makore Points 29

C'est incroyable que personne n'ait dit ça ici. Faire passer un viewmodel par un contrôleur de base est un désastre. Nous utilisons revendications des utilisateurs pour passer des informations à la page de mise en page (pour afficher des données utilisateur sur la barre de navigation par exemple). Il existe un autre avantage. Les données sont stockées via des cookies, il n'est donc pas nécessaire de les récupérer à chaque requête via des partiels. Il suffit de chercher sur Google "asp net identity claims".

-1voto

E Business Points 7

Ce que j'ai fait est très simple et ça marche.

Déclarez une propriété statique dans n'importe quel contrôleur ou vous pouvez créer une classe de données avec des valeurs statiques si vous voulez comme ceci :

public static username = "Admin";
public static UserType = "Administrator";

Ces valeurs peuvent être mises à jour par les contrôleurs en fonction des opérations. Vous pouvez ensuite les utiliser dans votre _Layout

Dans _layout.cshtml

@project_name.Controllers.HomeController.username
@project_name.Controllers.HomeController.UserType

-7voto

Vous pouvez utiliser comme ceci :

 @{ 
    ApplicationDbContext db = new ApplicationDbContext();
    IEnumerable<YourModel> bd_recent = db.YourModel.Where(m => m.Pin == true).OrderByDescending(m=>m.ID).Select(m => m);
}
<div class="col-md-12">
    <div class="panel panel-default">
        <div class="panel-body">
            <div class="baner1">
                <h3 class="bb-hred">Recent Posts</h3>
                @foreach(var item in bd_recent)
                {
                    <a href="http://stackoverflow.com/BaiDangs/BaiDangChiTiet/@item.ID">@item.Name</a>
                }
            </div>
        </div>
    </div>
</div>

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