【问题标题】:Alternative to Page_Load in ASP.NET (and a good WTF story)ASP.NET 中 Page_Load 的替代品(以及一个很好的 WTF 故事)
【发布时间】:2011-01-26 10:05:30
【问题描述】:

哇,我有一个问题(甚至可能是 Daily WTF 的问题),我希望有一个解决方案。 (我很抱歉发了这么长的帖子……)

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

好吧,当我将 Site.master(和这个控件)放到旧网站页面(我没有专门开发的页面)中时,我注意到其中一些页面看起来很糟糕,但不是全部。当我说它看起来很糟糕时,基本上,控件会将自身与页面左对齐,而不是像它应该的那样居中。我花了几个小时调试无济于事 - CSS 看起来是正确的,HTML 看起来还不错,我在 Javascript 中没有看到任何东西(尽管我确实错过了一些东西,我稍后会指出),甚至旧代码看起来是正确的(尽其所能——写得不是很好)。另一位同事看了看网站,一开始也找不到任何东西。

直到我只是想看看页面的渲染源代码(我一直在 IE8 中的开发人员视图中工作)才清楚出了什么问题。

原始开发人员在许多页面上执行搜索。为此,他在数据库中查询所有数据,然后将它们加载到页面内的 Javascript 数组中,以便访问它们。这本身就是一个大问题,因为我们谈论的是成千上万的项目,而且它显然是不可扩展的(而且,是的,网站很慢)。然而,它最终点击了搞砸 Site.master 的东西——当他将数据加载到 Javascript 数组中时,他使用大量 Response.Write(string) 调用在 Page_Load 上将数据写入 HTML。 WTF(以及让我感到困惑的事情)是他在 DOCTYPE 之前插入 Javascript,导致 IE 进入怪癖模式

所以,因为我至少需要发布这个版本(我稍后会解决真正的问题),所以我想知道:有没有一种方法可以强制将此 Javascript 插入到 HTML 的其他位置——在 DOCTYPE 之后至少?现在,所有 Response.Write() 调用都在 Page_Load 方法中完成。我只需要稍后插入它们。

【问题讨论】:

    标签: .net asp.net javascript html


    【解决方案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】:

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

      【讨论】:

        【解决方案3】:

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

        另一种更快速和肮脏的方法是将控件添加到页面,而不是 response.write,构建 JS,然后设置文字控件的文本属性。

        【讨论】:

        • +1 - 我们发布了同一秒,但您的回答更好:)
        • 谢谢,实际上我也重新措辞了,因为从技术上讲 Page.ClientScript 是“更好”且正确的方法......
        猜你喜欢
        • 1970-01-01
        • 2011-01-09
        • 2010-11-09
        • 1970-01-01
        • 2023-03-16
        • 2011-08-23
        • 1970-01-01
        • 2013-09-20
        • 2010-10-04
        相关资源
        最近更新 更多