如何将视图状态对象用作用户控件上控件的数据源

时间:2010-12-29 16:51:23

标签: asp.net custom-controls viewstate

我有一个控件列表视图。每行包含一个复选框和另一个列表视图。

外部列表视图绑定到控件上的属性(通过方法调用,不能将属性设置为它将出现的ObjectDataSource上的SelectMethod),这是一个延迟加载的:

    Public ReadOnly Property ProductLineChargeDetails() As List(Of WebServiceProductLineChargeDetail)
    Get
        If ViewState("WSProductLineChargeDetails") Is Nothing Then
            ViewState("WSProductLineChargeDetails") = GetWebServiceProductLineChargeDetails()
        End If

        Return DirectCast(ViewState("WSProductLineChargeDetails"), Global.System.Collections.Generic.List(Of Global.MI.Open.WebServiceProductLineChargeDetail))
    End Get
End Property

数据源引用的对象的形状如下:

(伪码)

Product
{
 bool Licenced;
 List<Charge> charges;
}

Charge
{
 int property1;
 string property2;
 bool property3
 .
 .
 .
}

使用viewstate的原因是:

当检查或取消选中其中一个外部列表视图行上的一个复选框时,我想修改ODS表示的对象(例如,我将向相关的Product对象添加几个Charge对象)和然后重新绑定。

我遇到的问题是每次回发后(特别是在检查或取消选中其中一行的复选框后),我的视图状态为空。这意味着我对viewstate'd对象所做的任何更改都将丢失。

现在,我已经研究过(经过大量的谷歌搜索和阅读,以及其他许多人,Scott Mitchel在ViewState上的优秀位置),在初始数据绑定期间 IsTrackingViewState 设置为false。这意味着,我认为,在初始数据绑定期间将GetWebServiceProductLineChargeDetails()的返回值分配给我的Property Get中的ViewState项将不起作用。

请注意,即使 IsTrackingViewState 为真,我调用属性Get,然后进行下一次回发,viewstate为空。

那么你是否有任何关于如何在回发之间保持ViewState中ObjectDataSource引用的对象并更新它并让这些更改保留在ViewState中的想法?这已经持续了几天,我已经厌倦了!

提前干杯

史蒂夫

1 个答案:

答案 0 :(得分:0)

为了在视图状态中跟踪更改,当IsTrackingViewState为True时,必须将对象分配给视图状态。 Viewstate在页面生命周期中的Init之后开始跟踪。您可能过早地将对象存储在viewstate中。您应该在Init阶段之后绑定列表视图,可能在加载阶段。

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs)
    ListView.DataSource = ProductLineChargeDetails
    ListView.DataBind
End Sub