如何绕过会话状态存储用户控件

时间:2013-07-31 10:41:23

标签: c# asp.net vb.net session-variables session-state

我试图在回发之间以会话状态存储usercontrol,使用SQL作为stateserver。

我得到的课程不可序列化错误:

Unable to serialize the session state. In 'StateServer' and 'SQLServer' mode, ASP.NET will serialize the session state objects, and as a result non-serializable objects or MarshalByRef objects are not permitted. The same restriction applies if similar serialization is done by the custom session state store in 'Custom' mode.

堆栈跟踪

SerializationException: Type 'ASP.bookingcontrols_controls_ucDates_ascx' in Assembly 'App_Web_eckjngpu, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null' is not marked as serializable.]

现在,将usercontorl类标记为Serializable,我仍然会收到此错误。从研究到目前为止,我已经确定用户控件无法序列化。细

解决此问题的一般提议似乎是从控件(接口/前端)拆分控制(数据),并在另一端重建它。

现在,在我尝试对代码进行一些有影响的更改之前,我的问题如下:

从usercontrol类派生但不是通过page.loadcontrol("control.ascx")创建为动态用户控件的对象是可序列化的,还是必须创建一个单独的“伴随类”来存储数据。如果是这样,我假设我不能从控件类继承来获取属性,因为它最终将继承不可序列化的usercontrol类?

示例:

未使用:

Dim myDatesControl As New UserControl
myDatesControl = Page.LoadControl("~/bookingControls/ucDates.ascx")

        With CType(myDatesControl, controls_ucDates)
            .checkInDate = Session("nowcheckin")
            .checkOutDate = Session("nowcheckout")
            .Nights = "xxx"
            .guid = currentBookingFilter.guid
            .ExtraInfo = currentBookingFilter
        End With

以下工作,作为可序列化为进程外会话状态的对象。

Dim myDatesControl As New controls_ucDates

        With CType(myDatesControl, controls_ucDates)
            .checkInDate = Session("nowcheckin")
            .checkOutDate = Session("nowcheckout")
            .Nights = "xxx"
            .guid = currentBookingFilter.guid
            .ExtraInfo = currentBookingFilter
        End With

在第二个区块中,myDatesControl是否可序列化?

1 个答案:

答案 0 :(得分:0)

n最终结果是继承自usercontrol类的myDatesContorl类无法序列化为会话状态。

我创建了一个“附带”类并复制了UC的属性。在我的代码中,然后我使用附带的类来存储控件的状态,并在显示之前创建控件,重新分配它们的属性。