Asp.net 如何使用viewstate';对象作为用户控件上控件的数据源

Asp.net 如何使用viewstate';对象作为用户控件上控件的数据源,asp.net,custom-controls,viewstate,Asp.net,Custom Controls,Viewstate,我有一个控件的列表视图。每行包含一个复选框和另一个列表视图 外部listview绑定到控件上的属性(通过方法调用,无法将属性设置为它将出现的ObjectDataSource上的SelectMethod),该属性延迟加载如下: Public ReadOnly Property ProductLineChargeDetails() As List(Of WebServiceProductLineChargeDetail) Get If ViewState("WSPro

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

外部listview绑定到控件上的属性(通过方法调用,无法将属性设置为它将出现的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
数据源引用的对象的形状如下所示:

(伪代码)

产品
{
bool执照;
列出费用;
}
要价
{
不动产1;
字符串属性2;
布尔财产3
.
.
.
}
使用viewstate的原因如下:

当外部列表视图行上的某个复选框被选中或取消选中时,我想修改ODS表示的对象(例如,我将向相关产品对象添加两个充电对象),然后重新绑定

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

现在,我已经计算出(在谷歌搜索和阅读了斯科特·米切尔(Scott Mitchel)关于ViewState的精彩文章之后),在初始数据绑定期间,IsTrackingViewState设置为false。这意味着,我认为,在初始数据绑定期间,将GetWebServiceProductLineChargeDetails()的返回值分配给我的属性Get中的ViewState项是行不通的

请注意,即使IsTrackingViewState为true并且我调用属性Get,在下一次回发时,viewstate也是空的

你们这些家伙对我如何在回发和更新之间将ObjectDataSource引用的对象保持在ViewState中,并使这些更改保持在ViewState中有什么想法吗?这已经持续了好几天了,我受够了

提前欢呼


Steve

如果IsTrackingViewState为True,则必须将对象指定给viewstate,以便在viewstate中跟踪更改。Viewstate在页面生命周期的Init之后开始跟踪。您可能绑定得太早,无法将对象存储在viewstate中。您应该在Init阶段之后绑定列表视图,可能是在load阶段

i、 e


是的,那肯定是我必须解决的问题。问题是,即使IsTrackingViewState为true(在CheckedChanged事件处理程序中),我也已经修改了ODS后面的对象,这些更改肯定会反映在ViewState中,然后在回发之后,ViewState中没有任何内容。哦,等等,我刚刚重新阅读了。因此,必须在跟踪ViewState更改后指定对象?啊,是的,这很有道理。回邮后你什么时候检查?它们应该在控件点击其加载事件后出现。如果没有,那么还有其他问题。我确实有另一个问题,在错误的位置重新绑定,但现在在加载中通过编程绑定解决了所有问题。您必须非常了解生命周期,才能使任何非琐碎的数据绑定正常工作,不是吗?谢谢你的帮助。现在我只会迟到4天!:)是的,你必须对asp的生命周期有一个很好的了解。对你来说总是充满惊喜
Product
{
 bool Licenced;
 List<Charge> charges;
}

Charge
{
 int property1;
 string property2;
 bool property3
 .
 .
 .
}
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs)
    ListView.DataSource = ProductLineChargeDetails
    ListView.DataBind
End Sub