想在自定义控件中根据不同条件输出不同脚本块且块数比较多,所以只想使用一个script标签,但某些情况下得出的结果却是先注册的<script>在后注册的</script>之后,程序示意如下:protected void ScriptRegist(string key,string script)
{
if(!Page.IsClientScriptBlockRegistered(key))
Page.RegisterClientScriptBlock(key,script);
}protected void xx()
{
string str1="<script language=javascript>";
ScriptRegist("scriptStart",str1); if(...)
{
string str3="function{....}";
ScriptRegist("script1",str1);
} if(...)
{
string str4="function{....}";
ScriptRegist("script2",str4);
} string str2="</script>";
ScriptRegist("scriptEnd",str1);
}
但有时做些影响程序逻辑的修改后又会按注册顺序输出,请问各位输出的脚本块是按什么决定顺序的?
到处都找不到答案,只好麻烦各位了,谢谢!

解决方案 »

  1.   

    if(...)
    {
    string str3="function{....}";
    ScriptRegist("script1",str1);
    }
    应为
    if(...)
    {
    string str3="function{....}";
    ScriptRegist("script1",str3);
    }
      

  2.   

    先把字符串连起来
    再Register一次就行
      

  3.   

    找到答案,大于八个以上的注册块不按注册顺序输出。。
    http://www.microsoft.com/china/msdn/library/webservices/asp.net/WorkwithClientSideScript.mspx
    /////////////////////////////////////////////////////////
    基于这个测试,您可能会认为这样的事实始终成立:在 HTML 页面中发出脚本块的顺序就是在服务器端代码中为它们指定的顺序。但是,这是一个不正确的假设,并且可以导致页面中断。例如,设想前面添加的脚本块在 HTML 页面中以相反的顺序发出。那么,您将会得到:<script language="JavaScript">alert('Hello, ' + name + '!');</script>
    <script language="JavaScript">var name='Sam';</script>这将会显示警告框“Hello, !”,因为变量 name 尚未分配值。显然,有些时候发出脚本块的顺序非常重要的。Page 类的注册方法 - RegisterClientScriptBlock、RegisterStartupScript、RegisterArrayDeclaration 和 RegisterHiddenFields - 全部将提供的脚本内容写入到内部 HybridDictionary 中。HybridDictionary 是在 System.Collections.Specialized 命名空间中发现的数据结构,设计用于在有很多项目未知的字典中存储项目。对于小型的项目集合,ListDictionary 是最有效的数据结构,但是对于较大的字典,Hashtable 会更有效。HybridDictionary 分离差异 - 它通过使用 ListDictionary 存储项目来开始。当 ListDictionary 添加了它的第九个项目后,HybridDictionary 会从使用 ListDictionary 切换到使用 Hashtable。尽管这种方法对于性能而言非常理想,但是如果您使用几个脚本块而且脚本块的顺序非常重要,那么它可能会带来严重的破坏。这是因为,ListDictionary 维护元素被添加的顺序,而 Hashtable 没有进行维护。因此,如果您将八个或更少项目添加到任意一个特定的注册方法中,项目将会以它们被添加的顺序发出。但是,如果添加了第九个项目,脚本发出的顺序看起来将是随机的。注ListDictionary 使用 linked list 存储它的元素,而 Hashtable 将它的元素存储在数组中,该数组的内容按照字符串键的哈希值进行排序。有关链接列表和哈希表的完整讨论已经远远超出了本文所讨论的范围。有关详细信息,包括对其性能的分析,请考虑阅读 An Extensive Examination of Data Structures,尤其是 Part 2 和 Part 4。如果您计划出现如下情况:可能会存在使用特殊注册方法添加的多于八个客户端元素,并且元素的出现顺序比较重要,那么您可能希望研究一下 Peter Blum 的免费的 RegisterScripts 库。对于所发出客户端元素的顺序,RegisterScripts 提供了更大的控制能力,并且还提供了无需手动添加 <script> 标记的选项,当利用 RegisterClientScriptBlock 或 RegisterStartupScript 方法包括客户端脚本时,您必须添加此标记。
    /////////////////////////////////////////////////////////
    希望对其他遇到此问题的朋友有所帮助。
      

  4.   

    顶一下,觉得这点没有ASP好用
    我看有个人写的asp代码,根据条件判断写入脚本的内容,并且是按顺序输出的
    代码大概如下:
    <%@LANGUAGE="VBSCRIPT" CODEPAGE="936"%>
    if (document.getElementById) {
    var tree = new WebFXTree('管理系统');
    tree.setBehavior('classic');
    tree.rendered = 0;
    tree.icon = "images/home.gif";
    tree.openIcon = "images/home.gif";
             <%if session("role")=1 then%>
    var a2_1=new WebFXTreeItem("帐号管理","manage/personlist.asp");
    a2_1.target="mainFrame";
    a2.add(a2_1);
    <%end if%>
    //这里if语句想加几个加几个,但是用ASP.NET好像就不能实现这个功能吧
      document.write(tree);
    }有哪位知道如何用.net条件判断写入内容的,并能够将脚本嵌入到其它页面中去?
      

  5.   

    没有哪个asp.net产品文档说RegisterClientScriptBlock按照程序执行顺序输出。