2010-09-17 7 views
1

Je migre un site Web vers un site Web à l'aide d'ASP .NET MVC2.ASP.NET MVC2: modification de la propriété css maître en fonction du paramètre de chaîne de requête

Dans le site d'origine, la page maître est codée en arrière pour vérifier une valeur de paramètre de chaîne de requête. En fonction de cette valeur, code-behind modifie dynamiquement certaines propriétés CSS pour masquer/afficher les éléments de la page maître.

Comme MVC2 n'a pas de code-behind parce que nous sommes supposés effectuer tout dans les contrôleurs, comment dois-je procéder dans ce cas?

Je vois ceci: asp.net mvc modifying master file from a view

Il répond en partie à mes besoins, mais le traitement de chaîne de requête est commune à toutes les pages. Comment puis-je déplacer ce traitement dans une section de code commune?

Cordialement.

Répondre

1

Une méthode d'aide ressemble à un bon endroit:

public static class HtmlHelperExtensions 
{ 
    public static string GetCss(this HtmlHelper htmlHelper) 
    { 
     // read some request parameter 
     // here you also have access to route data so the 
     // parameter could be part of your custom routes as well 
     var foo = htmlHelper.ViewContext.HttpContext.Request["foo"]; 

     // based on the value of this parameter 
     // return the appropriate CSS class 
     return (foo == "bar") ? "barClass" : "fooClass"; 
    } 
} 

Et quelque part dans votre page maître:

<body class="<%= Html.GetCss() %>"> 

Ou si vous allez toujours l'appliquer à la balise body seulement il pourrait être plus approprié de le faire afin de réduire la soupe tag:

public static class HtmlHelperExtensions 
{ 
    public static MvcHtmlString StartBody(this HtmlHelper htmlHelper) 
    { 
     var body = new TagBuilder("body"); 
     var foo = htmlHelper.ViewContext.HttpContext.Request["foo"]; 
     var bodyClass = (foo == "bar") ? "barClass" : "fooClass"; 
     body.AddCssClass(bodyClass); 
     return MvcHtmlString.Create(body.ToString(TagRenderMode.StartTag)); 
    } 
} 

et dans votre page maître à l'endroit de la balise body:

<%= Html.StartBody() %> 
+0

Merci. Cela semble bien. – Sylvain

0

je peux penser à deux solutions à ceci:

  1. Derive vos contrôleurs à partir d'une base de contrôleur et codez la Le paramètre ViewData y dépend des valeurs de formulaire affichées

  2. Ne pas utiliser ViewData du tout, mais simplement rechercher la valeur du formulaire dans la vue (en utilisant HttpContext.Current)

La deuxième méthode enfreint le modèle MVC. IMO est toujours acceptable dans certains scénarios, par exemple j'utilise cette approche pour mettre en évidence l'élément actuellement sélectionné dans un menu de navigation.

+0

Bonjour Adrian, à propos de # 1, je l'ai considéré mais j'ai lu que l'objet Request n'était pas accessible (je n'ai pas encore essayé) dans le contrôleur de base. # 2 est le moyen le plus facile, je suis d'accord. Mais comme vous l'avez dit, je voudrais éviter de violer le modèle MVC (si possible). Merci. – Sylvain

Questions connexes