2009-08-20 5 views
1

내 ScriptManager에서 참조되는 js 파일 (예 : "custom.js? 2009082020091417")의 경로에 "마지막으로 수정 된"타임 스탬프를 추가하고 싶습니다. 내 MasterPage에 포함 된) 및 모든 ScriptManagerProxies (내용 페이지)에서.코드에서 ScriptManager 프록시에 액세스

코드에서 ScriptManager에 쉽게 액세스 할 수 있습니다. 그런 다음 Scripts 컬렉션을 반복하여 선언적으로 설정 한 스크립트 경로를 가져온 다음 "? [lastmodifiedtimestamp]"에 새 경로를 "설정"합니다. .

문제는 존재할 수있는 ScriptManagerProxies를 얻는 방법을 알아낼 수 없다는 것입니다.

디버깅 할 때 비공개 멤버 (._proxies)에서 프록시를 볼 수 있습니다. 설명서를 살펴본 결과이 컬렉션에 실제로 공개적으로 액세스 할 수있는 위치를 확인할 수 없습니다.

내가 뭔가를 잃어 버렸나요?

나는이 내 콘텐츠 페이지의 Page_PreRenderComplete 이벤트의 기본 클래스에 다음 코드 :

ScriptManager sm = ScriptManager.GetCurrent((Page)this); 
if(sm != null) 
{ 
    foreach (ScriptReference sr in sm.Scripts) 
    { 
     string fullpath = Server.MapPath(sr.Path); 
     sr.PathWithVersion(fullpath); //extension method that sets "new" script path 
    } 
} 

위의 코드는 나에게 내 MasterPage에 정의 된 하나의 스크립트,하지만하지 다른 두 스크립트를 제공합니다 내 콘텐츠 페이지의 ScriptManagerProxy에 정의되어 있습니다.

답변

4

해결책을 제시하십시오. 병합 된 모든 스크립트에 액세스 할 수있는 유일한 곳은 ScriptManager의 ResolveScriptReference 이벤트입니다. 이 경우 정의 된 경로가있는 각 스크립트에 대해 js 파일의 마지막 수정 날짜를 기반으로하는 "버전 번호"에 대한 확장 메서드를 사용합니다. 이제 js 파일이 "버전 관리"되었으므로 js 파일을 변경하면 브라우저는 이전 버전을 캐시하지 않습니다.

마스터 페이지 코드 :

protected void scriptManager_ResolveScriptReference(object sender, ScriptReferenceEventArgs e) 
{ 
    if (!String.IsNullOrEmpty(e.Script.Path)) 
    { 
     e.AddVersionToScriptPath(Server.MapPath(e.Script.Path)); 
    } 
} 

확장 방법 : JS에 대한 매력처럼

public static void AddVersionToScriptPath(this ScriptReferenceEventArgs scrArg, string fullpath) 
{ 
     string scriptpath = scrArg.Script.Path; 

     if (File.Exists(fullpath)) 
     { 
      FileInfo fi = new FileInfo(fullpath); 
      scriptpath += "?" + fi.LastWriteTime.ToString("yyyyMMddhhmm"); 
     } 

     scrArg.Script.Path = scriptpath; 
} 
+0

작품,하지만 어떻게 할 (? 것) 당신이 당신의 자바 스크립트 (예 : CSS와 관련된 WebResource 파일을 처리, 이미지 등)? – jerhewet

관련 문제