65.9K
CodeProject 正在变化。 阅读更多。
Home

处理 INamingContainer 的项目框架

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.67/5 (2投票s)

2010 年 5 月 18 日

CPOL

1分钟阅读

viewsIcon

10169

用于处理 INamingContainer 的项目框架。

引言

本文将介绍我开发的一个框架,旨在简化在较旧的 ASP.NET 渲染框架中使用大量 JavaScript 客户端脚本和服务器端 INamingContainer 时的操作。

背景

当服务器控件在实现 INamingContainer 的容器内渲染到客户端时,这将修改控件的 ID。一个 ID 为 'txtUsername' 的文本框通常最终会得到一个 ID,该 ID 是控件在页面层次结构中的 $ 符号表示。例如,ctl_001$ctl_content1$txtUsername

获取此 ID 需要使用服务器端包含来从服务器请求它。这会施加限制,例如阻止嵌入脚本。

使用以下代码,这不再是一个问题。

Using the Code

以下是项目框架代码

var ctlHolder = function(id, ctl) {
  this.ID = id;
  this.Ctl = ctl;
}
var ctlDef = function() {
  this.Items = new Array();
  this.Add = function(item) { this.Items[this.Items.length] = item; };
  this.Get = function(id) {
    for (var obj in this.Items)
      if (this.Items[obj].ID == id)
        return this.Items[obj].Ctl;
    return null;
  }
  this.EndID = function(id) {
    var index = id.lastIndexOf('$');
    if (index == -1)
      index = id.lastIndexOf('_');
    if (index == -1)
      return id;
    else
      return id.substring(index + 1);
  }
}

var ctl = new ctlDef();

function catalogItems(items) {
  if (items == null) items = document.getElementsByTagName('html');
  for (var obj in items) {
    var item = items[obj];
    if (item.id)
      ctl.Add(new ctlHolder(ctl.EndID(item.id), item));
    if (item.childNodes)
      catalogItems(item.childNodes);
  }
}

要使用此框架,在页面加载时,需要调用 "catalogItems" 函数。可以通过将以下属性添加到 HTML 文档的 body 节点来实现。

onload="catalogItems(null);"

编目完成后,您现在可以将较长的 document.getElementById 调用替换为

Old:    document.getElementById('ctl_001$ctl_content1$txtUsername')
New:    ctl.Get('txtUsername')

关注点

我发现此脚本非常快。我当前项目中的一个大型页面加载量为 300K+,此方法循环遍历所有节点并在 0.1 秒内编目完成。

在最新的框架(如 MVC)中,不再强制执行 $ 符号命名约定。

© . All rights reserved.