Доступ к прокси ScriptManager в коде - PullRequest
1 голос
/ 20 августа 2009

У меня есть ситуация, когда я хотел бы добавить "последнюю модифицированную" метку времени к путям моих js-файлов (например, "custom.js? 2009082020091417"), на которые есть ссылки в моем ScriptManager (содержится в моей MasterPage) и в любых ScriptManagerProxies (контентных страницах).

Я могу легко получить доступ к 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 моей страницы содержимого.

1 Ответ

4 голосов
/ 21 августа 2009

Придумали решение. Кажется, что единственное место, где все объединенные сценарии могут быть доступны, находится в главном событии 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));
    }
 }

Метод расширения:

 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;
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...