Bre*_*ett 4 asp.net ajax cdn .net-4.0 ajaxcontroltoolkit
我知道还有另外一个问题要求同样的事情,但它现在几个月没有得到任何关注:https://stackoverflow.com/questions/3786088/how-to-force-ajax-control-toolkit-scripts-loading -从-CDN
我已将我的网站升级到.NET4,现在我正在使用scriptManager的EnableCDN ="true"标记.我的Ajax脚本正在从Microsoft CDN中引用我的预期,但我似乎无法从CDN加载我的AjaxControlToolkit脚本.相反,它们都通过ScriptResource.axd在本地加载.
我知道CDN文件的位置,我知道每次使用控件时我都可以引用这些文件,但是我有很多遗留代码可以从scriptmanager中自行加载,只需要拉出ScriptResource.axd文件.
有关如何从CDN加载控件工具包脚本的任何建议吗?我已经有了标准的WebForms.js等.
让我知道如果有什么我可以清理,这是我正在使用的脚本管理器:(我已经尝试过toolkitscriptmanager)
<asp:ScriptManager ID="ScriptManager1" runat="server" EnablePageMethods="true"
EnableCdn="true" EnableScriptLocalization="false"
LoadScriptsBeforeUI="false" EnableViewState="false" />
Run Code Online (Sandbox Code Playgroud)
Inf*_*oop 11
如果程序集未在其WebResourceAttributes中定义CDN路径,则EnableCDN将不知道去哪里.就是这样.
但是,如果您知道具有CDN路径的CDN,则可以定义自己的CDN路径.老实说,我不知道最新的ACT是否在CDN上.如果您使用的版本是40412,那么是,它是:http: //www.asp.net/ajaxlibrary/CDNACT40412.ashx
我在博客文章中描述了您定义自己路径的方式(在另一个答案中也有提及):http:
//weblogs.asp.net/infinitiesloop/archive/2009/11/23/asp-net-4-0-scriptmanager -improvements.aspx
这是一个例子,解释如下:
void Application_Start(object sender, EventArgs e) {
ScriptManager.ScriptResourceMapping.AddDefinition("Foo.js", typeof(FooControl).Assembly, new ScriptResourceDefinition {
ResourceName = "Foo.js",
ResourceAssembly = typeof(FooControl).Assembly,
CdnPath = "http://yadda-yadda/foo.js",
CdnDebugPath = "http://yadda-yadda/foo.debug.js",
});
}
Run Code Online (Sandbox Code Playgroud)
这是正在发生的事情.首先,存在一个程序集,我们称之为Foo.dll.它包含一个脚本作为名为"Foo.js"的嵌入式资源(.js扩展名是可选的).因此,asp:ScriptReferences(在页面上或来自服务器控件)到该资源将转到ScriptResource.axd.程序集的WebResourceAttribute脚本没有定义CDN路径,所以如果你打开CdnMode它仍然会去那里.
你想解决这个问题,所以你所做的就是定位那个脚本.为此,您必须参考其程序集和名称.他们一起识别脚本(如果你愿意的话,它是"主键").AddDefinition的前两个参数实现了这一点.
既然你已经将它作为目标,那么你就可以完全重新定义该脚本的含义.你把它放在另一个程序集,另一个路径,定义cdn路径..任何东西.
定义的ResourceName和ResourceAssembly属性确定脚本确实仍属于它来自的同一程序集.如果你打算从CDN加载,这似乎是不必要的.但它做了两件事:(1)如果关闭CDN它仍然有效,(2)它仍然能够确定资源的调试版本(foo.debug.js)或任何LOCALIZED版本(例如foo.fr-FR.js)存在于程序集中,从而知道CDN是否包含该版本(因为它不能很好地从服务器检查).因此,最好将定义赋予所有者(请注意,如果您未指定它们,则不会默认为原始所有者).
CdnPath和CdnDebugPath属性是显而易见的,这是您的最终目标.EnableCdn现在应该可以工作了!
我鼓励您尽可能使用ScriptMapping来定义脚本的详细信息,然后按名称而不是路径引用它们.由于您可以在一个位置定义脚本的所有详细信息,因此保持标记简单并且更加干燥.
现在......你如何使用AjaxControlToolkit做到这一点?
您将不得不为工具箱中的每个脚本编写其中一个映射.这不会很有趣,有几十个和几十个.不要为每个发行版和调试脚本编写单独的错误.这两个是一对,并用1映射定义.还有其中一些的本地化版本,但我不打扰它 - 消息是针对开发人员的错误消息,无论如何真的不需要本地化,因为该功能旨在本地化内容以便结束用户.
有一件事 - 在1或2个ACT脚本上试一试,以确保你做对了.此外,我还没有提到另外一个复杂性.
还记得当我说Name和Assembly聚集在一起来识别一个脚本(它的"主键")吗?这是真的,但是对于来自System.Web.Extensions或所谓的"AjaxFrameworkAssembly"的脚本有一个特殊规则.在这种情况下,指定空程序集或使用完全缺少该参数的重载是等效的.什么是"AjaxFrameworkAssembly"?好吧,System.Web.Extensions包含一个鲜为人知的特性,它允许程序集通过程序集级属性将自身断言为"AjaxFrameworkAssembly".这样做意味着"我是包含ms ajax脚本的程序集,你应该来找我而不是System.Web.Extensions".ACT使用它来"升级"System.Web.Extensions中嵌入的脚本.它有自己的那些具有更高版本号的脚本的副本.您所要做的就是引用程序集,然后,脚本会自动重定向到来自那里.这里的重点是,您可能无法在所有这些映射中指定程序集.但是,试一试,不要相信我的话.
这是InfinitiesLoop的答案.我现在回到你定期安排的节目:)
| 归档时间: |
|
| 查看次数: |
4690 次 |
| 最近记录: |