7

我写了一些代码来帮助控制 js 文件的版本。本质上,它围绕当前脚本管理器旋转,并在 javascript 文件路径中附加文件的 md5 哈希。所以

<script src="../Javascript/Navigation.js" type="text/javascript"></script>

变成

<script src="../Javascript/Navigation.js?md5=70D2B4D1F236C7E340D9152B9E4102C3" type="text/javascript"></script>

我认为这是一件相当普遍的事情(或它的变体)。我正在努力做的是拿起 app_themes 文件夹中的 css 文件并做同样的事情。

我如何进入并更改 css 链接?

4

3 回答 3

8

您可以使用控制适配器将这种行为巧妙地注入页面,如下所示:

public class PageAdapter : System.Web.UI.Adapters.PageAdapter
{
    protected override void OnPreRender(System.EventArgs e)
    {
        foreach (var link in Page.Header.Controls.OfType<HtmlLink>().ToList())
            if (link.Attributes["type"].Equals("text/css", StringComparison.OrdinalIgnoreCase))
                if (link.Attributes["href"].Contains("/App_Themes/{0}/".Fill(Page.Theme), StringComparison.OrdinalIgnoreCase))
                   /* process link */

        base.OnPreRender(e);
    }
}

您可以通过将以下内容保存为App_Browsers文件夹中的*.browser文件来插入它:

<browsers>
  <browser refID="Default">
    <controlAdapters>
      <adapter controlType="System.Web.UI.Page"
               adapterType="PageAdapter" />
    </controlAdapters>
  </browser>
</browsers>

总的来说,我认为控制适配器是一种强大的类似 AOP 的机制,用于将行为注入到控制/页面生命周期中;他们几乎完全被忽略了,有利于传统的子分类。

于 2010-01-07T15:12:11.733 回答
3

我面临一个问题,它在每次回发时都在 html 标记中重复 css 条目。例如,我有 newabc.css。代码会将其更改为 newabc.css?v=1。如果我在 5 次回发后看到 html 源代码,它将有 5 个“newabc.css?v=1”。所以我添加了link.EnableViewState = False,它工作正常,但它真的需要吗?

    Dim link As HtmlLink = Nothing

    For Each c As Control In Page.Header.Controls
        If TypeOf c Is HtmlLink Then
            link = TryCast(c, HtmlLink)

            If link.Href.IndexOf("App_Themes/", StringComparison.InvariantCultureIgnoreCase) >= 0 AndAlso link.Href.EndsWith(".css", StringComparison.InvariantCultureIgnoreCase) Then
                link.Href &= "?v=" & VER_CSS
                'link.EnableViewState = False
            End If
        End If
    Next
于 2015-02-26T14:57:14.340 回答
1

通过使用Combres来避免两次发明轮子。满足您的所有要求,甚至更多!

于 2010-01-07T11:21:06.210 回答