【问题标题】:Scriptmanager remove javascriptScriptmanager 删除 javascript
【发布时间】:2009-09-30 07:09:11
【问题描述】:

ASP.NET ScriptManager 控件自动插入各种内联javascript,如PageRequest 初始化。是否可以将其删除或移动到外部 js 文件中?

另外,脚本管理器总是添加 __DoPostback,即使页面上没有使用,如何避免或将其移至外部文件?

【问题讨论】:

  • FWIW 我创建了 missing __doPostBack(以及 __EVENTARTGET__EVENTARGUMENT 隐藏表单字段)的应用程序!这是一个如何发生的示例:forums.asp.net/p/335942/335994.aspx

标签: asp.net javascript scriptmanager


【解决方案1】:

首先,“__DoPostBack”是由控件插入的,这些控件可能会导致回发,例如将 AutoPostBack 属性设置为 true 的 DropDownList。由于 ScriptManager 基本上拦截了传统的回传,我相信这就是它插入函数的原因。

-- 以下只是我的想法... :)

现在,关于将所有内容移至外部文件。这并不容易,但它“可能”是可能的。 问题是 ASP.NET 在运行时生成脚本,因此您无法对其进行静态处理。您需要考虑的是为什么您首先要这样做。 事实上,大部分生成的脚本都是动态的,这使得缓存起来相当困难。 但是,如果你真的需要,你应该看看 HttpHandlers 和 HttpModules。

基本上,您需要以某种方式提取每个脚本标记(没有 src-attribute 集)。这可以在 HttpContext 的 BeginRequest 事件上的 HttpModule 中完成。现在您需要提取所有必要的信息,并将其替换为对可以作为替换的特定 HttpHandler 的引用。 但要完全改变,您有必要对现有脚本进行某种缓存。您可能会为此使用 ASP.NET 缓存。 棘手的部分是将现有缓存条目与新条目进行比较,并确定是获取缓存版本(将 HttpHandler 指向现有条目)还是生成新条目。如果您有很多脚本,那么这很可能是一项相当昂贵的操作。 此外,您需要确定客户端是否可以自己缓存(电子标签等可能会派上用场)。重要的是客户端避免每次都下载相同的不必要的脚本(我相信这是您的最终目标?)。

回顾一下:

  • 构建一个 HttpModule 来处理页面重写并将提取的脚本放入某种缓存(例如 ASP.NET 缓存)。
  • 构建一个 HttpHandler 以指向提取的脚本(它应该从缓存中流式传输内容)。应将处理程序放置在提取的内联脚本的位置。
  • 创建某种算法来确定缓存无效性。我不知道在请求之间可以更改什么样的脚本。

顺便说一句。脚本外部化最多是棘手的,所以你需要小心不要引入无法修复的错误;)

不是一个精确的解决方案,但我之前尝试过自己这样做,但没有任何运气......主要是因为时间太少。当你付钱去做一项任务时,这种优化是没有道理的...... :(

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-14
    • 1970-01-01
    • 1970-01-01
    • 2011-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多