如何判断ASP.net中的页面上是否存在具有给定src属性的<script>标记?</script>

时间:2010-05-11 13:40:45

标签: .net-2.0 webforms

就像标题所说,我试图找出是否需要包含我的ASP.net UserControl需要工作的脚本库。我不希望每页多次包含它,但我希望我的控件能够在同一页面上多次使用。

如何在我的控件的代码隐藏中检查是否存在给定的<script/>标记?

这是.Net 2.0,没有LINQ。

4 个答案:

答案 0 :(得分:2)

If !Page.ClientScript.IsClientScriptIncludeRegistered("jQuery")
    Page.ClientScript.RegisterClientScriptInclude("jQuery", "/scripts/jquery.js");

或者如果您需要脚本块,并且想要包含控件的类型:

if (!Page.ClientScript.IsClientScriptBlockRegistered(this.GetType(), "myScript"))
      Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "myScript"
                                       , "<script>alert('xx');</script>", false);

答案 1 :(得分:1)

这可能对您的使用有点过分,但在添加到页面之前我用它来搜索现有的CSS和JS:

private static bool HeaderLinkExists(Page page, string path)
{
    path = path.ToLowerInvariant();
    foreach (Control c in page.Header.Controls)
    {
        if (c is HtmlLink)
        {
            // stylesheet (or other links), check href
            HtmlLink link = (HtmlLink)c;
            if (link.Href.ToLowerInvariant().Contains(path))
            {
                return true;
            }
        }
        else if (c is HtmlGenericControl)
        {
            // any generic html tag, check for src or href
            HtmlGenericControl hgc = (HtmlGenericControl)c;
            if ((!string.IsNullOrEmpty(hgc.Attributes["src"]) && hgc.Attributes["src"].ToLowerInvariant().Contains(path)) || (!string.IsNullOrEmpty(hgc.Attributes["href"]) && hgc.Attributes["href"].ToLowerInvariant().Contains(path)))
            {
                return true;
            }
        }
        else if (c is LiteralControl)
        {
            // scripts or other html literal controls, use regex to look for src or hrefs and check each one
            LiteralControl lit = (LiteralControl)c;
            if (MatchLiteralText(lit.Text, path))
            {
                return true;
            }
        }
        else if (c is Literal)
        {
            // similar to above, use regex to look for src or hrefs and check each one
            Literal lit = (Literal)c;
            if (MatchLiteralText(lit.Text, path))
            {
                return true;
            }
        }
    }
    return false;
}

private static readonly Regex linkMatcher = new Regex(@"(?:src|href)\s*=\s*([""']?)(?<LinkValue>[^\1]+?)[\1>]", RegexOptions.Compiled);

private static bool MatchLiteralText(string text, string path)
{
    if (!string.IsNullOrEmpty(text))
    {
        text = text.ToLowerInvariant()
        foreach (Match m in linkMatcher.Matches(text))
        {
            if (m.Groups["LinkValue"].Value.Contains(path))
            {
                return true;
            }
        }
    }
    return false;
}


// usage:
if (!HeaderLinkExists(page, "/css/controlstyles.css"))
{
    HtmlHeadUtility.RegisterStylesheetInHeader(page, "~/css/controlstyles.css");
}
if (!HeaderLinkExists(page, "/js/controlscript.js"))
{
    HtmlHeadUtility.RegisterClientScriptIncludeInHeader(page, "~/js/controlscript.js");
}

如果您确定LINKSCRIPT保证在HEAD中,则效果很好。

答案 2 :(得分:0)

不,没有。

相反,您应该维护一组已包含的<script>标记,并在添加脚本时更新它。 (例如,[ThreadStatic] static List<String>

答案 3 :(得分:0)

我建议重新思考你的问题/解决方案。看起来你要做的就是将你的用户控件和使用它的页面结合起来。这将要求页面引用该脚本以便使用控件。

您是否有任何理由不能将脚本标记放在用户控件中,以便使用您的用户控件的页面不需要知道他们需要包含特定的脚本标记才能工作?

我倾向于认为如果你只想使用一个控件,你应该可以使用它。