【问题标题】:Single Reference to CSS File from ASCX Control从 ASCX 控件对 CSS 文件的单一引用
【发布时间】:2014-12-10 20:11:27
【问题描述】:

我正在编写一个需要引用 JavaScript 文件和 CSS 文件的 ASCX 控件。

显然,我只希望主机页面引用这些文件一次。所以我使用Page.ClientScript.RegisterClientScriptInclude() 来引用JavaScript 文件。然而,CSS 文件有点复杂。

我想也许我可以做到以下几点:

if (!Page.ClientScript.IsClientScriptIncludeRegistered(ScriptManagerJsKey))
{
    Page.ClientScript.RegisterClientScriptInclude(this.GetType(), ScriptManagerJsKey, ResolveClientUrl("~/javascript/PaymentSchedule.js"));

    HtmlLink cssLink = new HtmlLink();
    cssLink.Href = "~/css/PaymentSchedule.css";
    cssLink.Attributes["rel"] = "stylesheet";
    cssLink.Attributes["type"] = "text/css";
    Page.Header.Controls.Add(cssLink);
}

这里的想法是添加一个HtmlLink 来引用页眉中的CSS 文件,但只能引用一次。因为我相信这段代码只会添加一次 JavaScript 引用,所以我认为这可以解决问题。

但是,这实际上在文件的 head 部分中添加了对 CSS 文件的引用两次。

有没有人发现从 ASCX 控件中仅引用一次 CSS 文件的技巧?

【问题讨论】:

标签: asp.net webforms webusercontrol


【解决方案1】:

你可以使用HttpContext.Current.Items 来处理这类事情。

private void UserControl_Init(object sender, EventArgs e)
{
    this.addStyleSheet("~/css/PaymentSchedule.css");
}

private void addStyleSheet(String href)
{
    if (String.IsNullOrWhiteSpace(Convert.ToString(HttpContext.Current.Items[href])))
    {
        HttpContext.Current.Items[href] = href;
        HtmlLink sheet = new HtmlLink() {
            Href = href
        };
        sheet.Attributes["rel"] = "stylesheet";
        sheet.Attributes["type"] = "text/css";
        this.Page.Header.Controls.Add(sheet);
    }
}

【讨论】:

  • 这是一个不错的建议。但是,我决定发布一个我今天早上想出的解决方法,它不需要向当前上下文添加任何数据。
【解决方案2】:

你试过这样添加属性吗?

HtmlLink cssLink = new HtmlLink();
cssLink.Href = "~/css/PaymentSchedule.css";
cssLink.Attributes.Add("rel", "stylesheet");
cssLink.Attributes.Add("type", "text/css")
Page.Header.Controls.Add(cssLink);

【讨论】:

  • 为什么?呈现的链接很好。唯一的问题是我的控件的每个实例都在页面上呈现链接。
  • 抱歉,我看错了你的问题。如果您知道索引,您实际上可以指定将元素添加到的控件。 'Page.Header.Controls[0].Add(cssLink);'
  • 我不关注你。你明白我遇到的问题吗?这有什么帮助?
【解决方案3】:

我不确定为什么我的原始代码不应该工作。似乎IsClientScriptIncludeRegistered() 应该阻止我的if 语句中的代码运行多次。

无论如何,我是这样解决它的:

private static readonly string ScriptManagerJsKey = "PaymentScheduleControls.ascx.js";
private static readonly string CssLinkId = "PaymentScheduleControlCssLink";

protected void Page_Load(object sender, EventArgs e)
{
    if (!Page.ClientScript.IsClientScriptIncludeRegistered(ScriptManagerJsKey))
    {
        Page.ClientScript.RegisterClientScriptInclude(this.GetType(), ScriptManagerJsKey, ResolveClientUrl("~/javascript/PaymentSchedule.js"));
        if (Page.Header.FindControl(CssLinkId) == null)
        {
            HtmlLink cssLink = new HtmlLink();
            cssLink.ID = CssLinkId;
            cssLink.Href = "~/css/PaymentSchedule.css";
            cssLink.Attributes["rel"] = "stylesheet";
            cssLink.Attributes["type"] = "text/css";
            Page.Header.Controls.Add(cssLink);
        }
    }
}

此代码只是为 CSS 链接控件设置一个明确的 ID。然后,它会采取步骤仅添加尚未添加的链接。似乎工作正常。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-07
    相关资源
    最近更新 更多