Sharepoint 2010 指定为“时,未在部分回发中加载脚本引用”;新脚本引用(resourceName、assemblyName)";
我创建了一个ASP.NET AJAX控件,该控件按照实现。此控件在加载脚本资源时按预期工作;但是,问题是脚本资源并非总是加载的 当从完整回发加载时,该控件将加载所有适当的引用资源。这并不奇怪。控制工作正常。它遵循适当的Sharepoint 2010 指定为“时,未在部分回发中加载脚本引用”;新脚本引用(resourceName、assemblyName)";,sharepoint-2010,.net-3.5,asp.net-ajax,updatepanel,partial-postback,Sharepoint 2010,.net 3.5,Asp.net Ajax,Updatepanel,Partial Postback,我创建了一个ASP.NET AJAX控件,该控件按照实现。此控件在加载脚本资源时按预期工作;但是,问题是脚本资源并非总是加载的 当从完整回发加载时,该控件将加载所有适当的引用资源。这并不奇怪。控制工作正常。它遵循适当的IScriptControl规则,注册脚本控件并呈现适当的脚本描述符。实现了GetScriptReferences和GetScriptDescriptions 现在,当GetScriptReferences写为 public IEnumerable<ScriptReferen
IScriptControl
规则,注册脚本控件并呈现适当的脚本描述符。实现了GetScriptReferences
和GetScriptDescriptions
现在,当GetScriptReferences写为
public IEnumerable<ScriptReference> GetScriptReferences()
{
return new List<ScriptReference> {
new ScriptReference("Resource.js", GetType().Assembly.FullName)
}
}
。。然后加载资源,即使在部分回发中也是如此。请求可以在浏览器网络日志中查看为http://dev/WebResource.axd?d=..
。我希望避免使用第二种形式,因为这样我就必须手动添加代码
正在使用以下配置在自定义SharePoint 2010母版页中创建ASP.NET 3.5 ScriptManager(以替换默认ScriptManager控件):
<aspExt:ScriptManager runat="server" ID="MyScriptManager"
EnablePartialRendering="True" EnablePageMethods="True" EnableViewState="True"
EnableHistory="True" EnableSecureHistoryState="False"
EnableScriptLocalization="False" EnableScriptGlobalization="False"
LoadScriptsBeforeUI="True">
</aspExt:ScriptManager>
通过
ScriptManager.RegisterClientScriptResource
(从http://dev/ScriptResource.axd?d=..
)“工作”但是在这样做时,控件需要打破IScriptControl模型,并且不从GetScriptReferences返回任何引用,以便在完全和部分回发情况下都可以确保一致的行为。否则,在完全回发的情况下,当脚本资源实际正确加载时,同一资源将被加载多次。这似乎是SharePoint 2010的问题,我终于能够找到一些有关这方面的信息
这是Sharepoint 2010中的一个已知问题。如果控件最初不可见,则不会加载脚本资源
。。“Sharepoint 2010在部分回发时不发出javascript链接”问题。。如果在部分回发期间添加控件(或使控件可见),则发生
谢天谢地
微软终于在2011年10月的Sharepoint 2010累积更新中解决了这个问题。安装此更新通常可以解决隐藏的ajax控件注册脚本的问题
这似乎是第一个CU与修复-虽然我还没有验证这一点
对于历史参考,或者对于像我这样不能确保应用CU/SP的穷人,“工作”是手动注册资源。(这也可以在链接帖子中找到。)
公共类MyComboBox:RadComboBox
{
受保护的覆盖System.Collections.Generic.IEnumerable GetScriptReferences()
{
#如果手动\u脚本\u回发\u修复
HashSet registeredNames=新HashSet();
ReadOnlyCollection RegisteredScript=ScriptManager.GetCurrent(第页).GetRegisteredClientScriptBlocks();
foreach(RegisteredScript中的RegisteredScript)
{
registeredNames.Add(registeredScript.Key);
}
foreach(base.GetScriptReferences()中的ScriptReference引用)
{
如果(!registeredNames.Contains(reference.Name))
{
RegisterClientScriptResource(this,typeof(MyComboBox).BaseType,reference.Name);
}
}
返回新列表();
#否则
返回base.GetScriptReferences();
#恩迪夫
}
}
为什么有7张反对票而没有一条评论?@KyleMit我戴着它作为荣誉勋章,我的好先生!虽然这个问题和工作[希望!]已经过时,但一些可怜的笨蛋可能仍然会在其中找到用武之地。我还是那样做了,现在是2104。。叹息
<aspExt:ScriptManager runat="server" ID="MyScriptManager"
EnablePartialRendering="True" EnablePageMethods="True" EnableViewState="True"
EnableHistory="True" EnableSecureHistoryState="False"
EnableScriptLocalization="False" EnableScriptGlobalization="False"
LoadScriptsBeforeUI="True">
</aspExt:ScriptManager>
public class MyComboBox : RadComboBox
{
protected override System.Collections.Generic.IEnumerable<System.Web.UI.ScriptReference> GetScriptReferences()
{
#if MANUAL_SCRIPT_POSTBACK_FIX
HashSet<string> registeredNames = new HashSet<string>();
ReadOnlyCollection<RegisteredScript> registeredScripts = ScriptManager.GetCurrent(Page).GetRegisteredClientScriptBlocks();
foreach (RegisteredScript registeredScript in registeredScripts)
{
registeredNames.Add(registeredScript.Key);
}
foreach (ScriptReference reference in base.GetScriptReferences())
{
if (!registeredNames.Contains(reference.Name))
{
ScriptManager.RegisterClientScriptResource(this, typeof(MyComboBox).BaseType, reference.Name);
}
}
return new List<ScriptReference>();
#else
return base.GetScriptReferences();
#endif
}
}