有没有更好的方法将ClientID转换为外部JS文件?

时间:2009-05-10 08:52:37

标签: asp.net javascript

我知道之前已经问过这个问题,但是我发现了一种不同的方法来获取外部JS文件中的控件引用,但我不确定这会如何降低整体速度。

我的代码是

public static void GenerateClientIDs(Page page, params WebControl[] controls) {

        StringBuilder script = new StringBuilder();
        script.AppendLine("<script type=\"text/javascript\">");

        foreach (WebControl c in controls) {
            script.AppendLine(String.Format("var {0} = '#{1}';", c.ID, c.ClientID));
        }

        script.AppendLine("</script>");

        if (!page.ClientScript.IsClientScriptBlockRegistered("Vars")) {
            page.ClientScript.RegisterClientScriptBlock(page.GetType(), "Vars", script.ToString());
        }
    }

这是我可以在我的JS文件中引用aspx页面的id。

任何人都可以看到以这种方式做事的任何缺点吗?我刚开始使用外部JS文件。在将所有内容写入UserControl本身之前。

2 个答案:

答案 0 :(得分:1)

嗯,该方法只能在每个页面中使用一次,因此如果您从用户控件中调用它,则意味着您永远不能将其中两个用户控件放在同一页面上。

您可以将控件引用存储在列表中,直到PreRender事件,然后将它们全部放在页眉中的脚本标记中。这样,您可以多次调用该方法,并将所有客户端ID放在相同的脚本标记中。

类似的东西:

private const string _key = "ClientIDs";

public static void GenerateClientIDs(params WebControl[] controls) {
   Page page = HttpContext.Current.Handler As Page;
   List<WebControl> items = HttpContext.Current.Items[_key] as List<WebControl>;

   if (items == null) {
      page.PreRender += RenderClientIDs;
      items = new List<WebControl>();
   }

   items.AddRange(controls);

   HttpContext.Current.Items[_key] = items;
}

private static void RenderClientIDs() {
   Page page = HttpContext.Current.Handler As Page;
   List<WebControl> items = HttpContext.Current.Items[_key] as List<WebControl>;

   StringBuilder script = new StringBuilder();
   script.AppendLine("<script type=\"text/javascript\">");
   foreach (WebControl c in items) {
      script.AppendLine(String.Format("var {0} = '#{1}';", c.ID, c.ClientID));
   }
   script.AppendLine("</script>");

   page.Head.Controls.Add(new LiteralControl(script));
}

答案 1 :(得分:1)

检查出来:http://weblogs.asp.net/joewrobel/archive/2008/02/19/clientid-problem-in-external-javascript-files-solved.aspx

看起来它会为你处理肮脏的工作(像Guffa的答案)。它生成一个包含服务器ID和客户端ID的JSON对象(example),因此您可以在JavaScript中执行以下操作:

var val = PageControls.txtUserName.value;