【问题标题】:ASP.NET: Enumerating header elements from codebehindASP.NET:从后面的代码中枚举标头元素
【发布时间】:2010-12-21 03:08:56
【问题描述】:

在代码隐藏中的Page_Load() 上,我想枚举所有<link> 标记。目的是如果Page 的标记中未指定<link>,则我想将<link> 添加到CSS 文件中。

我该怎么做?

我想我应该能够在标题中的元素集合上使用 LINQ,不是吗?

这是我的伪代码

var pageAlreadyContainsCssLink = false;

foreach(var control in this.Header.Controls) {
    if (control.TagName == "link" &&
        control.Attributes["href"] == "my_css_file.css") {
        pageAlreadyContainsCssLink = true;
        break;
    }
}

if (pageAlreadyContainsCssLink) {
    // Don't add <link> element
    return;
}

// Add the <link> to the CSS

this.AddCssLink(...);

【问题讨论】:

  • 你的伪代码没问题。

标签: asp.net css hyperlink


【解决方案1】:

解决方法是将Controls集合枚举为HtmlGeneric控件:

    foreach(HtmlControl control in this.Header.Controls)
    {
        if (control is HtmlLink &&  control.Attributes["href"] == this.CssFileLinkHref)
        {
            pageAlreadyContainsCssLink = true;
            break;
        }
    }

【讨论】:

    【解决方案2】:

    是的,您的代码应该可以工作。但是,应该从根本上管理这种情况,防止它发生,这样您就不需要编写一些“以防万一”的代码来处理它。

    您的循环检查了 css 链接的出现,如果存在则退出。如果出现 2 次或以上怎么办?是否要删除重复项?

    我建议使用以下一种或组合:

    1. 母版页(您管理 css 文件的单一位置)
    2. 主题(所有 css 文件在每个页面请求中自动链接一次)
    3. 代码标准化
    4. 所有页面的页眉中的单个自定义控件(需要确保第 3 项到位)

    1 和 2 不适用于 ASP.NET 1.x,3 和 4 都适用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-08-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-17
      • 1970-01-01
      • 2021-08-11
      相关资源
      最近更新 更多