代码之家  ›  专栏  ›  技术社区  ›  Chris Baxter

ASP.NET MVC HTMLHelper API设计帮助

  •  7
  • Chris Baxter  · 技术社区  · 14 年前

    我正在为ASP.NET WebForms/MVC开发一个运行时复合资源库。我通过WebControls支持标准的ASP.NET Web窗体,最近还添加了对ASP MVC HTML帮助程序的支持。我目前支持WebForms WebControls的一个功能是“部分”资源定义的概念,在该定义中,可以在主控页/视图页等上组合资源。

    在实现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)与所有其他HTML助手不同,这些扩展不会立即写出HTML片段,而是等待上下文释放。这些扩展应该是离开viewContext(或其他对象)的吗?

    2)我个人认为“使用”的概念对于包装一个代码块是有意义的,而不是分开beginConcositeResourcePartContext/endCompositeResourcePartContext调用,您同意吗?如果不是,那么单独的方法调用有什么更好的呢?

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

    编辑

    澄清…母版页标题内的块和视图页侧的后续引用将合并到一个资源中。因此,当compositeResourcePartContext的上下文被释放时,所有六个文件只合并到一个css文件中,并作为一个链接标记(或script、css sprite等)写出。

    <link rel="stylesheet" type="text/css" href="/MyMergedStyleSheet.css" />
    
    2 回复  |  直到 14 年前
        1
  •  4
  •   Peter Mortensen Sumit Kumar    14 年前

    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>
    

        2
  •  2
  •   John Nelson    14 年前

    <%: Html.MergedStyleSheet() %>
    

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