禁用Repeater ViewState 提交后面页数据全没了

wuxiaobo0204 2009-04-08 12:46:35


页面上有个Repeater1 和 Button1

protected void Page_Load(object sender, EventArgs e)
{
if (!this.IsPostBack)
{
GetProducts(); 给Repeater1数据绑定
}
}

然后我把Repeater1 EnableViewState 属性设置为false

第一次加载页面一切正常, 当我点击按钮后..Repeater1中的数据没有了.

不知大家是怎么解决这个问题的..难道要每次提交后都要对Repeater1绑定数据,还是有更好的方法?


谢谢各位大侠








...全文
311 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
wpuuuu 2009-04-09
  • 打赏
  • 举报
回复
把ViewState的禁用作为优化手段 只是节省了页面在网络上的传输数据大小 具体的情况要看项目需求确定
你实在不愿意用,折中的方案是:数据保存在Cache中,回传时绑定,节省数据库的连接和读取,但同样的也会带来内存占用或硬盘IO的额外开销
wuxiaobo0204 2009-04-08
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 sunshine_anycall 的回复:]
所以每次都要重新绑定
[/Quote]
如果每次都要求重新绑定...那么禁用ViewState好像没什么意义...因为禁用ViewState都是用来提高网站性能...
但重新帮定后...又要重新查询...然后再发送到客户端...这样能提高性能吗?
sunshine_anycall 2009-04-08
  • 打赏
  • 举报
回复
所以每次都要重新绑定
sunshine_anycall 2009-04-08
  • 打赏
  • 举报
回复
由于HTTP请求完成之后会断开连接,把属性保存到私有变量中不会满足我们的要求(提交回发时会重新生成自定义控件类,有可能丢失属性值),所以保存到ViewState中,回发时能够正确恢复属性值
huang_net 2009-04-08
  • 打赏
  • 举报
回复
Session 是会话级的,
ViewState 是页面级的。
就是作用域不一样啊...
不能每个页面都能用。


ViewState做了什么?

这里是ViewState所作的主要工作的一个列表。每一个工作都达到了一个不同的目的。接下来我们会了解到它怎么完成这些工作的。

通过键名,每一个控件保存一些值,就像Hashtable.
跟踪对ViewState初始状态的改变。
序列化和反序列化保存的数据到客户端一个隐藏字段里。(大家比较清楚的只有这点吧?)
在postbacks时自动恢复ViewState数据。
chouto 2009-04-08
  • 打赏
  • 举报
回复
VIEWSTATE会在客户端生成很多代码,可以考虑将VIEWSTATE的代码存在服务器端,这样会减少每次客户端-服务器来回传递的带宽,对性能会有所提高

//重写PageStatePersister,将VIEWSTATE代码存在服务器端
protected override PageStatePersister PageStatePersister
{
get
{
return new SessionPageStatePersister(Page);
}
}
igelf 2009-04-08
  • 打赏
  • 举报
回复
问题描述:在为用户控件属性赋值后,重新刷一次页面或回传一次服务器,用户控件的属性就会消失,但是.NET自带的控件不会出现这种问题。

原因:要解释上面的问题,我们需要回顾一下 HTTP协议的工作模式,HTTP是一种无状态的断开式连接模式,也就是说,客户端向服务器发出请求,服务器端做出响应后就不在维持此次请求客户端的信息。在默认情况下,多次请求来自于同一个客户端还是多个不同的客户端,对于服务端来说处理方式没什么不同。

所以我们单击页面上的按钮,把页面回传到服务器后,服务器并不能把页面中的控件的所有状态还原到上一次请求时设置的值,因为它根本不知道上一次请求是哪一次,也没有为每一次请求保存历史信息。

解决方法:

HTTP的这种无状态特征为我们的开发带来了和Winforms开发模型极不一致,用户和控件交互的结果不能保存下来等问题。

而在实际开发过程中,我们又发现ASP 。NET提供的控件却可以很好的在页面回传过程中保存自己的状态。比如,我们在页面中添加一个Label控件,并在按钮事件中添加:

this.lblHappy.text += this.lblHappy.text + "again"
Label显示的文本可以正确地基于前次请求设置的值再加上“again”,这是怎么回事呢?

原来ASP.NET为了解决保存控件状态的矛盾,引入了一种叫视图(ViewState)的特性。需要在页面回传过程中保存值的控件属性,可以把值保存在视图状态中。(1)ASP.NET框架会在呈现页面前(服务器把页面发送到客户端),把视图状态信息序列化成一个字符串,并保存到页面中一个叫"_VIEWSTATE"的隐藏表单域(<input type = 'hidden'>)中.这样,控件的状态就保存到了客户端。(2)表单域下次回传时(客户端把页面提交到服务器),服务器端再对提交回的_VIEWSTATE隐藏域的值进行反序列化,还原各个控件的状态。

或者这样解释ViewState的原理:当请求某个页面时,ASP.NET把所有控件的状态序列化成一个字符串,然后做为窗体的隐藏属性送到客户端。当客户端把页面回传时,ASP.NET分析回传的窗体属性,并赋给控件对应的值。当然这些全部是由ASP.NET负责的。

jiangshilin9982 2009-04-08
  • 打赏
  • 举报
回复
你把你的Button1 丢到UpdatePanel里面去吧.
freewind0521 2009-04-08
  • 打赏
  • 举报
回复
ViewState应该不会怎么影响到网站性能吧,如果不用ViewState,每次去查询显示数据,这样才影响性能呢
i3men 2009-04-08
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 hmily821023 的回复:]
Session 是会话级的,
ViewState 是页面级的。
就是作用域不一样啊...
不能每个页面都能用。


ViewState做了什么?

这里是ViewState所作的主要工作的一个列表。每一个工作都达到了一个不同的目的。接下来我们会了解到它怎么完成这些工作的。

通过键名,每一个控件保存一些值,就像Hashtable.
跟踪对ViewState初始状态的改变。
序列化和反序列化保存的数据到客户端一个隐藏字段里。(大家比较清楚的只有这…
[/Quote]

5楼好牛
sealzrt 2009-04-08
  • 打赏
  • 举报
回复
楼上正解
hmily821023 2009-04-08
  • 打赏
  • 举报
回复
Session 是会话级的,
ViewState 是页面级的。
就是作用域不一样啊...
不能每个页面都能用。


ViewState做了什么?

这里是ViewState所作的主要工作的一个列表。每一个工作都达到了一个不同的目的。接下来我们会了解到它怎么完成这些工作的。

通过键名,每一个控件保存一些值,就像Hashtable.
跟踪对ViewState初始状态的改变。
序列化和反序列化保存的数据到客户端一个隐藏字段里。(大家比较清楚的只有这点吧?)
在postbacks时自动恢复ViewState数据。
igelf 2009-04-08
  • 打赏
  • 举报
回复
ViewState是干什么用的都没搞清楚.
你认为只要禁用ViewState就能提高网站性能,那ViewState何用?

62,268

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧