代码之家  ›  专栏  ›  技术社区  ›  JasCav

asp.net中页面加载的替代方法(以及一个好的wtf故事)

  •  5
  • JasCav  · 技术社区  · 16 年前

    喔,我有一个问题(甚至可能是一个为每日世界贸易基金会),我希望有一个解决方案。(我为这篇长文章道歉…)

    我在一个月前继承了一个网站。我一直在研究的一个部分是修复其中一个控件(本质上是一个动态标题栏),以便它按照用户的请求显示附加信息。作为这个项目的一部分,我创建了一个site.master文件,这样就不必将标题栏重新编码到每个页面中。当我第一次开始这样做的时候,它看起来工作得很好。我开发的所有页面看起来都很不错,而且工具栏也在不断更新,显示了我应该显示的信息。

    好吧,当我把site.master(和这个控件)放到旧的站点页面(我没有特别开发的页面)时,我注意到有些页面看起来很糟糕,但不是所有的页面。当我说它看起来很糟糕时,基本上,控件会左对齐到页面,而不是像它应该的那样居中。我花了几个小时调试,但没有结果-css看起来是正确的,html看起来是正常的,javascript中没有看到任何东西(尽管,我确实错过了一些东西,我将在一秒钟内指出),甚至旧代码看起来也是正确的(尽其所能-它写得不太好)。另一位同事看了一下网站,一开始也什么也找不到。

    直到我考虑查看页面的呈现源代码(我一直在IE8的开发人员视图中工作到现在为止),才发现问题所在。

    原始开发人员在许多页面上执行搜索。为了实现这一点,他查询数据库中的所有数据,然后将它们加载到页面中的javascript数组中,以便能够访问它们。这本身就是一个巨大的问题,因为我们正在讨论成千上万的项目,而且它显然是不可扩展的(是的,网站很慢)。然而,它最终点击了导致site.master崩溃的地方——当他将数据加载到javascript数组中时,他使用大量response.write(string)调用在页面加载时将数据写入html。世跆联(以及让我困扰的)是他 在doctype之前插入javascript,使ie进入quirks模式 !

    所以,因为我至少需要发布这个版本(稍后我会解决真正的问题),我想知道:有没有一种方法可以强制至少在doctype之后将这个javascript插入到html的其他地方?现在,所有的response.write()调用都在page\u load方法中完成。我只需要稍后再插入。

    3 回复  |  直到 16 年前
        1
  •  5
  •   Mitchel Sellers    16 年前

    有很多方法可以做到这一点,很可能“正确”的方法是构建字符串,然后使用 Page.ClientScript.RegisterClientScriptBlock 方法来注册js,这将把它放在正确的位置。

    另一种替代方法,更快捷和肮脏的方法是向页面添加控件,而不是response.write,构建js,然后设置文本控件的文本属性。

        2
  •  1
  •   FlashXSFX    16 年前

    替换响应的最简单方法。写入调用可能是使用StringBuilder:

    StringBuilder sb = new StringBuilder();
    sb.Append("your script writes here"); // instead of Response.Write
    

    并使用page.clientscript管理器将脚本放在可以使用的位置。有几种方法可以注册脚本,每种方法都将脚本放置在页面上的不同位置,具体取决于当前控件的生命周期。下面是一个例子(已经在上面讨论过了):

    Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "yourScriptKey", sb.ToString());
    
        3
  •  0
  •   cllpse    16 年前

    将生成的javascript代码放入母版页上的属性中,母版页对其进行处理。母版页呈现 之后 它封装的页面,但其成员可用于其内容页面。

    推荐文章