이것은 당신의 사용에 대한 약간의 과잉 될 수도 있지만 나는 페이지를 추가하기 전에 기존 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
이어야합니다.
흥미 롭습니다. 이것은'Page.ClientScript.IsClientScriptIncludeRegistered'보다 우수합니까? 나는 당신이 이것을 어떻게 포함 시켰는지에 대한 간단한 견해를보고 싶다. – Armstrongest
@Atomiton : 'RegisterClientScriptInclude'를 사용하는 경우에만 작동합니다. 기본적으로,'[ThreadStatic]'리스트에 스크립트의 URL을 추가하고 스크립트가 이미 포함되어 있으면 false를 반환하는'RegisterScript'라는 메소드로 정적 클래스를 만들 수 있습니다. 그런 다음'RegisterScript'가'true'를 반환하는 경우에만 스크립트 태그를 작성합니다. 모든 페이지로드에 대한 목록을 지우십시오. – SLaks
그래서이 스크립트가 페이지에 쓰여지는 위치와 시점을 제어 할 수있는 장점이 있다고 생각합니다. 예를 들어 Asp.Net이 좋아하는 것처럼 본문과는 대조적으로 문서의 머리 부분에 글을 쓸 수 있습니다. – Armstrongest