2010-05-11 2 views
2

제목과 마찬가지로 ASP.net UserControl이 작동해야하는 스크립트 라이브러리를 포함해야하는지 확인하려고합니다. 페이지 당 여러 번 포함하고 싶지 않지만 같은 페이지에서 여러 번 사용할 수 있어야합니다.주어진 src 특성을 가진 <script> 태그가 ASP.net의 페이지에 있는지 어떻게 알 수 있습니까?

내 컨트롤의 코드 숨김에서 주어진 <script/> 태그가 있는지 어떻게 확인할 수 있습니까?

이것은 .Net 2.0이며 LINQ가 아닙니다.

답변

0

아니요, 없습니다.

대신 이미 포함되어있는 <script> 태그 집합을 유지 관리해야하며 스크립트를 추가 할 때마다 업데이트해야합니다. (예를 들어, [ThreadStatic] static List<String>)

+0

흥미 롭습니다. 이것은'Page.ClientScript.IsClientScriptIncludeRegistered'보다 우수합니까? 나는 당신이 이것을 어떻게 포함 시켰는지에 대한 간단한 견해를보고 싶다. – Armstrongest

+0

@Atomiton : 'RegisterClientScriptInclude'를 사용하는 경우에만 작동합니다. 기본적으로,'[ThreadStatic]'리스트에 스크립트의 URL을 추가하고 스크립트가 이미 포함되어 있으면 false를 반환하는'RegisterScript'라는 메소드로 정적 클래스를 만들 수 있습니다. 그런 다음'RegisterScript'가'true'를 반환하는 경우에만 스크립트 태그를 작성합니다. 모든 페이지로드에 대한 목록을 지우십시오. – SLaks

+0

그래서이 스크립트가 페이지에 쓰여지는 위치와 시점을 제어 할 수있는 장점이 있다고 생각합니다. 예를 들어 Asp.Net이 좋아하는 것처럼 본문과는 대조적으로 문서의 머리 부분에 글을 쓸 수 있습니다. – Armstrongest

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); 
0

내가 제안은 문제/솔루션을 다시 생각. 당신이하려는 것은 사용자 정의 컨트롤과 그것을 사용하는 페이지를 결합시키는 것처럼 보입니다. 이렇게하려면 컨트롤을 사용하기 위해 스크립트를 호출하는 페이지 참조가 필요합니다.

사용자 정의 컨트롤을 사용하는 페이지가 특정 스크립트 태그를 포함해야하는지 알 필요가 없도록 스크립트 태그를 사용자 정의 컨트롤에 넣을 수없는 이유가 있습니까?

컨트롤을 사용하고 싶다면 그냥 사용할 수 있어야한다고 생각하는 경향이 있습니다.

+0

이것은 사실입니다 ...하지만 당신의 컨트롤이 당신이 작성한 js 함수에 의존성이 있다면 어떻게 될까요? 그리고 컨트롤이 페이지에 여러 번 나타나는 경우 어떻게해야합니까? 컨트롤에서 js 함수를 등록 할 수 있지만 이전에 등록되었는지 확인하고 확인하면됩니다. – Armstrongest

+1

이것이 내가이 일을하는 이유입니다. 단축키를 서버 측의 페이지에 포함시키는 것입니다. 내 컨트롤의 사용자는 스크립트 라이브러리가 이미 포함되어 있어도 걱정할 필요없이 다른 컨트롤이나 원하는 곳에 배치 할 수 있어야합니다. 참고로 JQuery 단축키 플러그인입니다. 내가 원하는대로하면 컨트롤의 인스턴스가 여러 개있는 경우 라이브러리가 여러 번 포함됩니다. –

+0

스크립트 참조로 컨트롤을 작성하는 것이 좋습니다.하지만 컨트롤을 방어 적으로 작성하여 페이지에서 사용할 때 스크립트의 추가 인스턴스를 등록하지 않도록하십시오. 컨트롤을 작성할 때 모르는 부분은 컨트롤의 인스턴스가 여러 개있는 경우가 아니라 동일한 스크립트 라이브러리를 사용하는 다른 컨트롤이있을 수 있습니다. 편집 : jQuery 단축키 스크립트에 익숙하지 않습니다. 가능하다면 컨트롤을 독립적으로 만들려고 노력하고 SLaks 제안이나 Atomiton을 솔루션 구현까지 고려해야합니다. – Adam

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"); 
} 

그것은 좋은 작품 LINK 또는 SCRIPTHEAD이어야합니다.

관련 문제