リフレクターを少し掘り下げましたが、残念ながらこれを追加するのは難しいようです。MSは私が見つけることができる良い拡張ポイントを提供しませんでした。ただし、優れたリフレクションハックを使用する場合は、次のControlAdapterforScriptManagerを追加することでうまくいくはずです。
public class VersionedScriptManagerAdapter : ControlAdapter
{
protected new ScriptManager Control
{
get { return (ScriptManager) base.Control; }
}
protected override void OnPreRender(System.EventArgs e)
{
base.OnPreRender(e);
var compositeScriptField = Control.GetType().GetField("_compositeScript",
BindingFlags.NonPublic | BindingFlags.Instance);
var currentCompositeScript = Control.CompositeScript;
var versionedCompositeScript = new VersionedCompositeScriptReference();
CopyCompositeScript(currentCompositeScript, versionedCompositeScript);
compositeScriptField.SetValue(Control, versionedCompositeScript);
}
private void CopyCompositeScript(CompositeScriptReference sourceCompositeScript, CompositeScriptReference targetCompositeScript)
{
targetCompositeScript.Path = sourceCompositeScript.Path;
targetCompositeScript.ResourceUICultures = sourceCompositeScript.ResourceUICultures;
targetCompositeScript.ScriptMode = sourceCompositeScript.ScriptMode;
foreach (var scriptReference in sourceCompositeScript.Scripts)
{
targetCompositeScript.Scripts.Add(scriptReference);
}
}
private class VersionedCompositeScriptReference : CompositeScriptReference
{
protected override string GetUrl(ScriptManager scriptManager, bool zip)
{
string version = ConfigurationManager.AppSettings["ScriptVersion"];
return base.GetUrl(scriptManager, zip) + "&v=" + version;
}
}
}
次に、このコントロールアダプターを接続するには、Web.browserファイルを作成し、それをWebサイトのApp_Browsersフォルダーに配置する必要があります。Web.browserファイルは次のようになります。
<browsers>
<browser refID="Default">
<controlAdapters>
<adapter controlType="System.Web.UI.ScriptManager"
adapterType="MyNamespace.VersionedScriptManagerAdapter">
</adapter>
</controlAdapters>
</browser>
</browsers>
私はこれをテストしました、そしてそれは私のために働きました。お役に立てば幸いです。