2010-11-02 8 views
7

Je travaille sur une bibliothèque de ressources composites d'exécution pour ASP.NET WebForms/MVC. Je supporte les WebForms ASP.NET standard via WebControls et j'ai récemment ajouté la prise en charge des ASP MVC Html Helpers. Une fonctionnalité que je supporte actuellement avec WebForms WebControls est le concept de définitions de ressources "Partielles" où une ressource peut être combinée sur les pages Maître/Vue.Aide sur la conception d'API HtmlHelper ASP.NET MVC

Lors de la mise en œuvre de l'équivalent MVC, je ne suis pas sûr de ce que le meilleur la pratique est? Je me penche actuellement vers un quelque chose de conception comme:

Maître page

<% using (Html.CreateCompositeResourcePartContext()) 
    { 
    Html.CompositeCssResourcePart(
     "ResourceName", 
     new[] { "/Styles/SharedStyle1.css", "/Styles/SharedStyle2.css" } 
    ); 
    %> 
    <asp:ContentPlaceHolder ID="head" runat="server"> 
    </asp:ContentPlaceHolder> 
<% } %> 

qui va créer une enveloppe « contexte » autour de la tête ContentPlaceHolder.

Voir la page

<asp:Content ID="HeadContentPlaceholder" ContentPlaceHolderID="head" runat="server"> 
    <% Html.CompositeCssResourcePart(
    "ResourceName", 
    new[] 
    { 
     "/Styles/PageStyle5.css", 
     "/Styles/PageStyle6.css", 
     "/Styles/PageStyle7.css" 
    }) %> 
</asp:Content> 

Donc, toutes les pages de vue peut étendre la définition de ressource partielle comme on le voit ci-dessus.

Les questions que j'ai:

1) Contrairement à tous mes autres HtmlHelpers, ces extensions n'écrivent pas immédiatement le fragment HTML, mais plutôt attendre que le contexte est disposé. Ces extensions doivent-elles être désactivées à la place de ViewContext (ou d'un autre objet)?

2) Personnellement, je pense que le concept d'un «usage» a du sens pour emballer un bloc de code plutôt que des appels distincts BeginCompositeResourcePartContext/EndCompositeResourcePartContext, seriez-vous d'accord? Si non, quoi de mieux sur les appels de méthode séparés?

Tout commentaire sur ce qui précède serait grandement apprécié. Si plus de détails sont requis, s'il vous plaît faites le moi savoir.

Modifier

Pour clarifier ... le bloc intérieur de la tête de la page principale et la référence suivante dans le côté d'une page de vue sera combiné ensemble pour une seule ressource. Ainsi, lorsque le contexte de CompositeResourcePartContext est disposé, tous les fichiers SIX sont combinés en un seul fichier css et écrit comme un seul lien TAG (ou d'un script, sprite css, etc.)

<link rel="stylesheet" type="text/css" href="/MyMergedStyleSheet.css" /> 
+0

Je ne suis pas sûr de ce que cette aide vous achète. N'est-ce pas ce que les espaces réservés pour le contenu sont en premier lieu? –

+0

@John - L'idée est que chaque appel à Html.CompositeCssResourcePart définira une partie d'une ressource composite (c'est-à-dire, sera fusionné dans un seul fichier lorsque le contexte est éliminé). En tant que tel, j'ai besoin d'une méthode de collecte de toutes les parties avant qu'un tag de lien/script puisse être rendu car l'URL est générée à partir de toutes les ressources référencées. Logique? –

+0

'utiliser 'est logique dans ce contexte, mais je ne peux pas commenter au-delà de cela. –

Répondre

4

après lui avoir donné un peu plus pensé (et consulter un collègue) Je pense que la meilleure option est de coller avec mon plan initial de ne pas polluer mon ASP API .NET MVC avec le concept de définitions de ressources "partielles" (fonctionne pour WebControls, mais pas aussi bien avec MVC à mon avis).Avant d'envisager une extension HtmlHelper explicite pour ce cas dans ma bibliothèque, je suggère que la question peut être traitée par la définition d'une méthode d'extension personnalisée comme suit:

public static class CustomXpediteExtensions 
{ 
    private static readonly IEnumerable<String> SharedCss = new[] 
    { 
     "/Styles/SharedStyle1.css", 
     "/Styles/SharedStyle2.css", 
     "/Styles/SharedStyle3.css" 
    }; 

    public static MvcHtmlString CustomCompositeCssResource(this HtmlHelper htmlHelper, params String[] resources) 
    { 
     return htmlHelper.CompositeCssResource(SharedCss.Concat(resources)); 
    } 
} 

Et puis référencement simplement que l'extension personnalisée (ou constante, etc. .) dans la page de vue.

<asp:Content ID="Content2" ContentPlaceHolderID="head" runat="server"> 
    <%= Html.CustomCompositeCssResource(
     "/Styles/PageStyle5.css", 
     "/Styles/PageStyle6.css", 
     "/Styles/PageStyle7.css" 
    ) %> 
</asp:Content> 

Cela vous permettra de ne pas vous répéter lors de la combinaison des ressources partagées (à savoir, la cohérence assurant) et, finalement, gérer le cas.

Je vais laisser cela ouvert pendant un moment pour voir s'il y a des commentaires à ce sujet; mais à moins d'un bon argument pour expliquer pourquoi cela n'est pas acceptable, je pense que c'est la réponse.

+0

Brillant, je vole ça .. –

2

Il semble être une bonne idée, mais il pourrait être mieux servi dans le cadre du processus de construction. Vous pouvez facilement créer des CSS fusionnées pour des pages individuelles en utilisant un modèle T4, et peut-être une convention de nommage pour ajouter cette référence CSS à votre page. Quelque chose comme:

<%: Html.MergedStyleSheet() %> 

pourrait générer:

<link rel="stylesheet" type="text/css" href="/Content/ControllerName/ActionName.css" /> 
+0

J'ai déjà utilisé des tâches de construction, et c'est certainement une option. Le principal avantage que je vois à l'approche d'exécution est que vous pouvez définir vos ressources dans chaque page presque comme vous le feriez régulièrement et pouvez facilement basculer entre les modes minifié/combiné et de débogage sans effort supplémentaire requis; De plus, comme je gère les sprites CSS, j'aime personnellement voir la définition de sprite directement dans la page qui la consomme. Mon intérêt est dans l'API proposée pour le scénario ci-dessus que je n'ai pas encore couvert. –