2009-05-07 9 views
2

Je tente de créer un menu global dans mon ASP.NET MVC site.master et je me demandais comment accéder à la propriété Paramètres de l'application à partir du site.master balisage? Auparavant, j'aurais probablement instancié un objet config à partir du code-behind de mon site.master, puis j'ai défini une propriété publique. Mais maintenant je me gratte la tête ... il me faut plus de café.Accès aux paramètres de l'application dans la vue ASP.NET MVC

mis à jour avec le code de réponse

Ajout d'une option de chaîne aux propererties d'application appelée baseurl et il a donné une valeur de "http://mysite.com"

Fait une classe de modèle de GlobalMenu.cs

public class GlobalMenu 
{ 
    private string _baseurl; 
    public string baseurl 
    { 
     get { return _baseurl; } 
     set 
     { 
      _baseurl = value; 
     } 
    } 

} 

Création d'une classe de contrôleur de base nommée BaseController et héritée de Controller, et étendue OnActionExecuted ainsi:

 protected override void OnActionExecuted(ActionExecutedContext filterContext) 
    { 
     string baseurl = Properties.Settings.Default.baseurl; 

     GlobalMenu menumodel = new GlobalMenu(); 
     menumodel.baseurl = baseurl; 
     ViewData["menudata"] = menumodel; 
     base.OnActionExecuted(filterContext); 
    } 

Création une vue partielle appelée ViewGlobalMenu dans le dossier partagé qui a été fortement typé à Globalmenu qui ressemble à ceci ... mais avec plus de choses évidemment:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<MyApp.Web.Models.GlobalMenu>" %> 

Enfin, dans Site.master I ajouté ceci à l'endroit où je voulais que le menu affiche:

<%Html.RenderPartial("ViewGlobalMenu", (MyApp.Web.Models.GlobalMenu)ViewData["menudata"]); %> 

Répondre

1

Voici la stratégie que j'utiliserais probablement. Créez un contrôleur de base à partir duquel vos autres contrôleurs dériveront et proviendront de Controller. Substituez la méthode ActionExecuted dans le contrôleur de base et activez-la pour accéder aux paramètres de l'application (et probablement les mettre en cache). Générez ViewData pour votre menu en tant que classe de modèle de menu fortement typée affectée à une clé particulière dans ViewData. Vous devez seulement fournir le modèle aux actions qui retournent un ViewResult (et, peut-être, PartialViewResults).

Créez une vue partielle fortement typée qui implémente le balisage de menu global à l'aide de la classe de modèle de menu. Incluez ceci dans la définition MasterPage via RenderPartial. Transmettez l'élément ViewData correspondant à la clé en tant que modèle à la vue partielle pour pouvoir utiliser les propriétés du modèle dans votre menu.

+0

A travaillé comme un clin d'oeil ... merci! Ajouter mon exemple de code ci-dessus. – Webjedi

+0

Jusqu'à ce que vous oubliez de dériver tous vos contrôleurs du contrôleur de base. Je suis actuellement en train de regarder une solution qui lit l'objet Properties dans un HttpModule ou un HttpHandler. – belugabob

+0

@belugabob - c'est pourquoi nous testons. – tvanfosson

Questions connexes