我有一种情况,我想在我的ScriptManager(包含在我的MasterPage中)中引用的js文件路径(例如“custom.js?2009082020091417”)中添加“最后修改”时间戳。以及任何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中定义的其他两个脚本。
答案 0 :(得分: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));
}
}
扩展方法:
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;
}