2010-11-02 21 views
7

Sto lavorando su una libreria di risorse composite di runtime per ASP.NET WebForms/MVC. Supporto sia i WebForms standard di ASP.NET tramite WebControls che recentemente ho aggiunto il supporto per gli helper Html ASP MVC. Una caratteristica che attualmente sto supportando con WebForm WebControls è il concetto di definizioni di risorse "Parziali" in cui una risorsa può essere combinata sulle pagine Master/View ecc.Aiuto con ASP.NET MVC HtmlHelper API Design

Quando si implementa l'equivalente MVC, non sono sicuro quale sia il migliore la pratica è? Attualmente sto appoggiato verso un qualcosa di design come:

pagina master

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

che creerà una wrapper "contesto" intorno alla testa ContentPlaceHolder.

Visualizza pagina

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

Così le pagine vista può estendere la definizione delle risorse parziale come visto sopra.

domande che ho:

1) A differenza di tutti gli altri miei HtmlHelpers, queste estensioni non scrivono immediatamente il frammento di codice HTML, ma piuttosto aspettare fino a quando è disposto il contesto. Queste estensioni dovrebbero invece essere fuori dal ViewContext (o qualche altro oggetto)?

2) Personalmente ritengo il concetto di "usare" ha senso per avvolgere un blocco di codice, piuttosto che le chiamate/EndCompositeResourcePartContext separati BeginCompositeResourcePartContext, sei d'accordo? Se no, cosa c'è di meglio delle chiamate di metodo separate?

Qualsiasi feedback su quanto sopra sarebbe molto apprezzato. Se sono necessari ulteriori dettagli, per favore fatemelo sapere.

Modifica

Per chiarire ... il blocco all'interno della testa della pagina Maestro e il successivo riferimento nel lato di una pagina di visualizzazione saranno combinati insieme in una singola risorsa. Così, quando il contesto di CompositeResourcePartContext è disposto, tutti e sei i file sono combinati a un solo file css e vengono scritti su come un singolo tag link (o dello script, css sprite ecc)

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

Non sono sicuro di ciò che questo aiutante ti compra. In primo luogo, non è questo il contenuto dei segnaposto? –

+0

@John - L'idea è che ogni chiamata a Html.CompositeCssResourcePart definirà una parte di una risorsa composita (ad esempio, verrà unita in un singolo file quando il contesto è disposto). Pertanto, ho bisogno di un metodo per raccogliere tutte le parti prima che un tag link/script possa essere reso mentre l'URL viene generato da tutte le risorse a cui si fa riferimento. Ha senso? –

+0

"usare" ha senso in questo contesto, ma non posso commentare oltre. –

risposta

4

Dopo aver dato ancora un po 'il pensiero (e di consultare un collega) mi sembra che l'opzione migliore è quella di attaccare con il mio piano originale di non inquinare il mio ASP .NET MVC API con il concetto di definizioni di risorse "parziali" (funziona per WebControls, ma non è bello con MVC secondo me).Prima di considerare un'estensione HtmlHelper esplicita per questo caso nella mia biblioteca, ho suggerito che la questione può essere gestito attraverso la definizione di un metodo di estensione personalizzata come segue:

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)); 
    } 
} 

E poi semplicemente riferimento che un'estensione personalizzata (o costante, ecc .) nella pagina di visualizzazione.

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

Questo vi permetterà di non ripetere se stessi quando si combinano le risorse condivise (vale a dire, di garantire la coerenza) e, infine, gestire il caso.

Lascerò aperto per un po 'per vedere se c'è qualche feedback su questo; ma a meno che non venga fatto un buon caso per spiegare perché questo non è accettabile, penso che sia la risposta.

+0

Brillante, sto rubando questo .. –

2

Sembra una grande idea, ma potrebbe essere meglio servito come parte del processo di compilazione. È possibile creare facilmente CSS uniti per singole pagine utilizzando un modello T4 e forse una convenzione di denominazione per aggiungere il riferimento CSS alla pagina. Qualcosa di simile:

<%: Html.MergedStyleSheet() %> 

potrebbe uscita:

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

Ho usato le attività di compilazione in passato e questa è sicuramente un'opzione. Il vantaggio principale che vedo nell'approccio runtime è che puoi definire le tue risorse in ogni pagina quasi come faresti regolarmente e puoi facilmente passare da una modalità minified/combinata a una di debug senza sforzi aggiuntivi; inoltre non devi preoccuparti di mantenere le attività di compilazione o i problemi di controllo della versione ecc. Inoltre, maneggiando CSS Sprites, personalmente mi piace vedere la definizione dello sprite direttamente nella pagina che la sta consumando. Il mio interesse è nell'API proposta per lo scenario di cui sopra che devo ancora coprire. –

Problemi correlati