2010-11-02 76 views
7

我正在为ASP.NET WebForms/MVC运行时组合资源库。我通过WebControl支持标准的ASP.NET WebForms,并且最近还增加了对ASP MVC Html Helpers的支持。我目前支持WebForms WebControl的一个功能是“部分”资源定义的概念,其中资源可以通过主/视图页面进行组合。帮助ASP.NET MVC HtmlHelper API设计

当实现MVC等效项时,我不确定什么是最好的练习是?我目前倾向于设计是这样的:

母版页

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

,这将创造头部周围的ContentPlaceHolder“上下文”包装。

查看页面

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

所以从上面可以看出任何视图页面可以延长部分资源定义。

的问题,我有:

1)我不像其他HtmlHelpers,这些扩展不要马上写出来的HTML片段,而是等到情境布置。这些扩展是否应该取代ViewContext(或其他对象)?

2)我个人认为“使用”的概念是有意义的,可以包装一段代码而不是单独的BeginCompositeResourcePartContext/EndCompositeResourcePartContext调用,你会同意吗?如果不是,那么单独的方法调用有什么更好的?

以上任何反馈将不胜感激。如果需要更多细节,请告诉我。

编辑

为了澄清...主页的头部和在侧相继的基准内的块的图页将被一起组合在单个资源。因此,当CompositeResourcePartContext的环境布置,所有六个文件组合成只有一个CSS文件,并写出来作为单独的链接TAG(或脚本,CSS雪碧等)

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

我不确定这个帮手会给你买什么。首先,这不是占位符的内容吗? – 2010-11-02 13:04:55

+0

@John - 这个想法是,每次调用Html.CompositeCssResourcePart都会定义一个复合资源的一部分(即,当上下文被处理时,将会合并到一个文件中)。因此,我需要一种收集所有零件的方法,因为在引用的所有资源中生成URL时,可以呈现链接/脚本标记。说得通? – 2010-11-02 13:08:43

+0

'使用'在这种情况下是有意义的,但除此之外,我无法评论。 – 2010-11-02 13:17:55

回答

4

给它一些更多的思考(和咨询同事),我觉得最好的办法是坚持我原来不污染我的ASP的计划之后.NET MVC API具有“部分”资源定义的概念(适用于WebControls,但在我看来与MVC不太一样)。此前考虑这种情况在我的图书馆明确的HtmlHelper扩展,我建议,这个问题可以通过定义如下自定义扩展方法来处理:

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

,然后简单地引用该自定义扩展(或常数等)在视图页面中。

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

这将使您在组合共享资源(即确保一致性)时不会重复自己,并最终处理案件。

我会离开这段时间看看是否有任何反馈,但除非有一个很好的例子说明为什么这是不可接受的,我认为这是答案。

+0

辉煌,我在偷这个.. – 2015-02-05 05:33:46

2

这似乎是一个伟大的想法,但它可能更适合作为构建过程的一部分。您可以使用T4模板轻松地为各个页面创建合并的CSS,并且可能会将该CSS引用添加到页面的命名惯例。喜欢的东西:

<%: Html.MergedStyleSheet() %> 

可以输出:

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

我以前使用过构建任务,这绝对是一种选择。我在运行时方法中看到的主要优点是,您可以像定期那样定义每个页面中的资源,并且可以轻松地在缩小/组合和调试模式之间切换,而无需额外的工作;你也不必担心维护构建任务或版本控制问题等。另外,当我处理CSS Sprites时,我个人喜欢直接在正在使用它的页面中看到精灵定义。我的兴趣在于我尚未涉及的上述场景的拟议API。 – 2010-11-02 14:17:17