哇,我有一个问题(甚至可能是每日WTF的一个),我希望有一个解决方案。 (我为长篇文章道歉......)
我一直在研究一个月前我继承过的网站。我一直在研究的一个部分是修复其中一个控件(本质上是一个动态标题栏),以便它显示我的用户请求的其他信息。作为这个项目的一部分,我创建了一个Site.master文件,这样我就不必将标题栏重新编码到每个页面中。当我第一次开始这样做时,它看起来效果很好。我开发的所有页面看起来都很棒,并且条形图已更新,因为它应该显示所需的信息。
好吧,当我将Site.master(以及此控件)放入较旧的网站页面(我没有专门开发的网页)时,我注意到它们中的一些看起来很糟糕,但并非全部。当我说它看起来很糟糕时,基本上,控件会将自身对齐到页面而不是应该居中。我花了几个小时调试无济于事 - CSS看起来没错,HTML似乎没问题,我在Javascript中没有看到任何东西(虽然,我确实错过了一些东西,我会在一秒钟内指出),甚至旧代码看起来是正确的(尽可能最好 - 它编写得不是很好)。另一位同事看了看这个网站,一开始也找不到任何东西。
直到我只想到查看页面的渲染源代码(我在IE8中一直在开发人员视图中工作),才明白出现了什么问题。
原始开发人员在许多页面上执行搜索。为此,他向数据库查询所有数据,然后将它们加载到页面中的Javascript数组中,以便他可以访问它们。这本身就是一个很大的问题,因为我们谈论的是成千上万的项目,而且它显然不具备可扩展性(而且,是的,网站速度很慢)。然而,它最终点击了搞砸Site.master的东西 - 当他将数据加载到Javascript数组中时,他使用大量的Response.Write(字符串)调用在Page_Load上将数据写入HTML。 WTF(还有什么让我搞砸了)是他在DOCTYPE之前插入Javascript导致IE进入怪癖模式!
所以,因为我需要至少得到这个版本(我稍后会解决真正的问题),我想知道:有没有办法可以强制将这个Javascript插入HTML-DOCTYPE之后的其他地方至少?现在,所有Response.Write()调用都在Page_Load方法中完成。我只是需要稍后插入它们。
答案 0 :(得分:5)
有很多方法可以做到这一点,很可能这样做的“正确”方法是构建字符串,然后使用Page.ClientScript.RegisterClientScriptBlock方法注册JS,这样就可以了在正确的地方
另一种选择,更多的是快速和肮脏的方式是向页面添加一个控件,而不是response.write,构建JS,然后设置文字控件的文本属性。
答案 1 :(得分:1)
替换Response.Write调用的最简单方法可能是使用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());
答案 2 :(得分:0)
将生成的JavaScript代码放入主页面的属性中,主页面处理它。母版页在之后呈现封装的页面,但它的成员可以使用它的内容页面。