Как я могу узнать, присутствует ли тег <script>с данным атрибутом src на странице в ASP.net? - PullRequest
2 голосов
/ 11 мая 2010

Как видно из названия, я пытаюсь выяснить, нужно ли мне включать библиотеку сценариев, необходимую для работы моего ASP.net UserControl. Я не хочу включать его несколько раз на страницу, но я хочу, чтобы мой элемент управления можно было использовать несколько раз на одной странице.

Как в коде моего элемента управления проверить, присутствует ли данный тег <script/>?

Это .Net 2.0, без LINQ.

Ответы [ 4 ]

2 голосов
/ 11 мая 2010
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 голос
/ 03 марта 2011

Это может быть немного излишним для вашего использования, но я использую его для поиска существующих 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");
}

Это прекрасно работает, если вы уверены, что LINK или SCRIPT гарантированно будет в HEAD.

0 голосов
/ 11 мая 2010

Я бы предложил переосмыслить вашу проблему / решение. Похоже, что вы пытаетесь соединить ваш пользовательский элемент управления и страницы, которые его используют. Это потребует, чтобы страница ссылалась на этот скрипт, чтобы использовать элемент управления.

Есть ли какая-то причина, по которой вы не можете просто поместить тег script в свой пользовательский элемент управления, чтобы страницы, потребляющие ваш пользовательский элемент управления, не знали, что для работы нужно включить определенный тег script?

Я склонен думать, что если вы хотите просто использовать элемент управления, вы можете просто использовать его.

0 голосов
/ 11 мая 2010

Нет, нет.

Вместо этого вы должны сохранить набор тегов <script>, которые уже были включены, и обновлять его при каждом добавлении сценария. (Например, [ThreadStatic] static List<String>)

...