ASP.NET自定义控件 - 替代PostBack的方法?

5
在我深入探究自定义ASP.NET控件开发的过程中,我显然要了解ASP.NET PostBack模型以及它如何影响控件开发。
我知道在ASP.NET中控件没有“生命周期”,因此必须在每个页面加载时重新初始化。我们通过将对象的值/参数保存到ViewState中来克服这一问题。
因此,我阅读的许多文章建议不要使用PostBack,因为这可能会给页面增加相当大的开销。我不是在寻找如何禁用它,我已经知道了。
我想知道的是:
我们有哪些替代方案来初始化控件而不使用PostBack模型?
我知道我们可以使用QueryString,但那似乎非常凌乱,而且不可靠。
理想情况下,您可以给我一个不同方法的架构/设计概述以及其优缺点。
非常感谢^_^
5个回答

3

好的,Session State是一种服务端解决方案,如果您想完全避免ViewState,需要处理其自有的一些问题。但实际上,在自定义控件中使用ViewState很好 - 只需挑选好存储内容 - 只存储声明控件状态的增量,不要存储任何您将在postback中获取的内容(例如从DB调用),等等。


我认为你给出了一个明智而中立的答案,正是我想要的。我正在继续尝试制作控件,毫无疑问,将来我会带着更多问题回来。我正在慢慢理解如何明智地使用ViewState,从WinForms转过来,这种无状态的方式确实有些难以适应! - Rob Cooper

1

如果你真的想完全寻找PostBack模型的替代方案,那么我建议你研究ASP.NET MVC框架。我很想抛弃WebForms并在MVC中完成所有工作,但遗留代码是一个棘手的问题,重写几乎从来不是答案,所以我继续努力...


有一件我非常非常想做的事情,但可悲的是我们的工作还没有迈向MVC :( 这是我明年打算努力改变的一件事 :D 我们仍然在使用ASP classic开发应用程序 :( - Rob Cooper
我上一份工作是在一个混合的ASP/ASP.NET网站上工作,我试图开始使用MVC。MVC可以轻松地与WebForms共存。路由引擎将路由MVC URL,并传递任何不匹配的URL。虽然我没有亲自尝试过,但我相信它是可行的。 - sliderhouserules

1

你必须将值存储在某个地方,因此你只能使用查询字符串和隐藏表单字段。如果你将其与HTTP相关联,基本上就是GET或POST参数。

我想你可以使用cookies,但那会非常混乱。


1
  1. 将对象状态存储在会话上下文中:这将把保持状态的负担从客户端转移到服务器端,对于小规模的内部网络应用程序可能是可接受的。但对于大型互联网站,这种方法行不通;

  2. 使您的控件支持 AJAX:在这种情况下,只需要提交状态更改即可。选择正确的框架非常关键;请参见http://www.asp.net/ajax/ajaxcontroltoolkit/samples/以获取官方 MS 方法;还有许多其他可能性。


0

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


你确定这是正确的吗?我知道标记是编译过的,但由于控件值随每个请求而改变,据我所知,存储这些值的唯一地方是PostBack。 - Rob Cooper
好的,这就是我的观点。我已经做了。并且我观察到(如预期)每次页面请求时控件都会重新初始化,我的更改都会丢失? - Rob Cooper
Rob - 你是正确的。页面对象将使用声明的控件值作为默认值进行重建。然后,ViewState 覆盖在其上,应用更改。 - Greg Hurlman
假设在ASPX中,我有一个叫MyCtl的控件,并且MyCtl.Val = 1。当我运行应用程序,单击按钮并将MyCtl.Val = 2时,在页面刷新后它会显示为1,除非我将这个非默认值保存在ViewState中? - Rob Cooper
所以回到问题,我正在寻找使用PostBack模型的其他方法 :) - Rob Cooper
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接