【问题标题】:ASP.NET Custom Controls - Alternatives to PostBack?ASP.NET 自定义控件 - PostBack 的替代品?
【发布时间】:2010-09-09 16:50:13
【问题描述】:

在深入了解自定义 ASP.NET 控件开发的过程中,我显然对 ASP.NET PostBack 模型及其对控件开发的影响有所了解。

我了解控件在 ASP.NET 中没有“生命周期”,因此必须在每次页面加载时重新初始化。我们通过将对象值/参数持久化到 ViewState 来克服这个问题。

因此,我阅读的许多文章都建议不要使用 PostBack,因为这会给页面增加相当大的开销。 我不是在寻找如何禁用它,我知道。

我正在寻找的是:

除了使用 PostBack 模型来初始化控件之外,我们还有哪些替代方法?

我知道我们可以使用 QueryString,但这看起来非常混乱,而且显然不可靠。

理想情况下,您可以概述一下不同方法的架构/设计以及它的优缺点。

非常感谢^_^

【问题讨论】:

    标签: asp.net postback viewstate custom-server-controls


    【解决方案1】:

    嗯,Session State 是一种服务器端解决方案,如果您想完全避免 ViewState,它会处理自己的一堆麻烦事。但实际上,在自定义控件中使用 ViewState 一切都很好——只是对你存储的内容挑剔——只存储声明的控件状态的增量,不要存储任何你将在回发时得到的东西(例如从DB调用)等

    【讨论】:

    • 我认为你做出了一个明智而中立的答案,正是我想要的。我继续搞乱控制,所以毫无疑问我将来会带着更多的 Q 回来。我慢慢地明智地使用 ViewState,来自 WinForms 很难习惯无状态!
    【解决方案2】:

    您必须将值存储在某处,因此您仅限于查询字符串和隐藏的表单字段。如果您将其与 HTTP 相关联,则基本上它是 GET 或 POST 参数。

    我想你可以使用 cookie,但那样会很麻烦。

    【讨论】:

      【解决方案3】:
      1. 将对象状态存储在会话上下文中:这会将保持状态的负担从客户端转移到服务器,可能对于小型 Intranet 应用程序是可以接受的。对于 Capital-I 互联网上的网站,这将不起作用;

      2. AJAX 启用您的控件:在这种情况下,只有状态 更改 需要回发。选择正确的框架是关键;有关官方 MS 方法,请参阅http://www.asp.net/ajax/ajaxcontroltoolkit/samples/;许多其他的都是可能的。

      【讨论】:

        【解决方案4】:

        我认为您仍然对控件有一些误解。控件只有在您将它们动态添加到页面时才会出现您描述的问题。如果您在 aspx 代码中预先声明您的控件,那么它们将与页面一起构建。

        【讨论】:

        • 你确定这是正确的吗?我知道标记是编译的,但是随着每个请求的控件值发生变化,AFAIK 存储这些值的唯一地方是 PostBack?
        • 嗯,这就是我的意思。我有。而且我观察到(如预期的那样)控件在每个页面请求上重新启动并且我的更改丢失了?
        • 取决于您所说的“更改”是什么意思,以及您如何进行更改。 只要控件在加载阶段之前存在,控件的状态就应该自动恢复。
        • Rob - 你是对的。使用声明的控件值作为默认值重建页面对象。然后,将 ViewState 置于其之上,应用更改。
        • Joel 所描述的是您从 Control 获得的默认功能。
        【解决方案5】:

        如果您真的在寻找 PostBack 模型的替代品,那么我建议您研究 ASP.NET MVC 框架。我很想把 WebForms 踢到路边,在 MVC 中做我所有的事情,但是,唉,遗留代码是一个 tarbaby,重写几乎永远不是答案,所以我继续插...

        【讨论】:

        • 我真的非常想做的事情,但遗憾的是,工作还没有升级到 MVC :( 我打算明年努力改变的事情 :D 我们仍然有 ASP 经典应用程序:(
        • 我的上一份工作是我有一个混合的 ASP/ASP.NET 站点,我试图开始在 MVC 中做一些事情。 MVC 可以很容易地与 WebForms 共存。路由引擎将路由 MVC URL,并传递它不匹配的任何内容。可能是错的,因为我没有这样做,但我很确定它有效。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-23
        • 2011-06-15
        • 2011-07-26
        • 2010-12-29
        • 2010-11-10
        相关资源
        最近更新 更多