2010-03-19 4 views
2

Dans mon site, j'ai des fichiers CSS spécifiques au contrôleur en plus de mon fichier css maître. Par exempleASP.NET MVC chargement de CSS basé sur le contrôleur

CSS/ 
    Prodcuts/ 
      product.css 
      ... 
    Blog/ 
     blog.css 
     ... 
    masterStyle.css 

où masterStyle.css est le fichier css principal. Ce que je veux faire, c'est quand l'utilisateur frappe http://www.example.com/Products/ seulement mySite.css et tous les fichiers CSS sous Produits sont inclus. Quelle est la meilleure façon de faire cela?

Répondre

0

Dans votre page maître créer l'espace réservé suivant dans la section <head>.

page principale

<asp:ContentPlaceHolder ID="HeadContent" runat="server"></asp:ContentPlaceHolder> 

Ensuite, à l'intérieur de votre contrôleur, vous devez déterminer la liste des fichiers .css à utiliser ainsi que de créer une chaîne que les vues peuvent utiliser pour placer facilement le contenu dans la page . Voici ce que j'ai utilisé.

Contrôleur

public ActionResult Index() 
{ 
    ViewData["Message"] = "Welcome to ASP.NET MVC!"; 

    List<string> css = new List<string>() 
    { 
     "one.css", 
     "two.css", 
     "three.css", 
     "four.css" 
    }; 

    IList<string> cssTags = new List<string>(); 

    StringBuilder cssTag = new StringBuilder(); 

    css.ForEach(c => 
     { 
      cssTag.AppendLine(string.Format(@"<link href=""{0}"" rel=""stylesheet"" type=""text/css"" />", HttpUtility.HtmlEncode(c))); 
     }); 

    ViewData["css"] = cssTag.ToString(); 

    return View(); 
} 

ensuite dans votre vue il suffit de placer le follwing

Voir

<asp:Content ID="headContent" ContentPlaceHolderID="HeadContent" runat="server"> 
<%= ViewData["css"] %> 
</asp:Content> 

La raison pour laquelle je construis la liste des Css à l'intérieur du contrôleur puis créez une chaîne que la vue utilise, car je veux que les vues soient b E aussi stupide que possible. Une option serait de simplement placer la liste des fichiers .css dans le ViewData lui-même, puis laisser la vue faire la boucle et créer la balise link, mais il est préférable de le faire ailleurs si possible.

Une autre option pour utiliser ViewData consiste à utiliser une vue fortement typée avec une propriété de chaîne, puis la vue sélectionne ce type. Personnellement, je n'utilise pas le dictionnaire ViewData. Au lieu de cela, toutes mes vues sont fortement typées.

0

Une façon simple pourrait être d'ajouter un "custom.css" à chaque vue sous-répertoire et utiliser dans la page principale:

<link href="/<%= ViewContext.RouteData.Values["Controller"]%>/custom.css" rel="stylesheet" type="text/css" /> 
0

place ContentPlaceHolder dans la section de la tête de votre page maître :

<head runat="server"> 
    <asp:ContentPlaceHolder ID="HeadContent" runat="server" /> 
</head> 

Ensuite, vous pouvez placer vos styles dans ce contenu dans les vues (ou créer une autre page maître qui hérite de la page principale de maître pour chaque contrôleur) :

<asp:Content ID="ContentHeadContent" ContentPlaceHolderID="HeadContent" runat="server"> 
    <link href="custom.css" rel="stylesheet" type="text/css" /> 
</asp:Content> 
Questions connexes