Saving list<> across postbacks

  • Thread starter Thread starter tshad
  • Start date Start date
T

tshad

I have a page that is using a List collection (list<>) and I want to save it
across postbacks.

I tried adding it to my ViewState but get an error:

Type 'AutoUPS.ClientList' in Assembly 'AutoUPS, Version=1.0.0.0,
Culture=neutral, PublicKeyToken=null' is not marked as serializable.

How do I set this up so I can save it?

In my web page I am doing:

public partial class AutoUPS : System.Web.UI.Page
{
private int exceptionDrop;
public static ClientList clientList = new ClientList();

...

protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
}
else
{
clientList = (ClientList)ViewState["ClientList"];
}
}

protected override void OnPreRender(EventArgs e)
{

base.OnPreRender(e);
ViewState["ClientList"] = clientList;
}

I am calling this from another page so I have my ClientList set as a static
and then want to save it so I don't have to call the database all the time.

Not sure if this is the best way but it seemed so.

Thanks,

Tom
 
tshad said:
I have a page that is using a List collection (list<>) and I want to save it
across postbacks.

I tried adding it to my ViewState but get an error:

Type 'AutoUPS.ClientList' in Assembly 'AutoUPS, Version=1.0.0.0,
Culture=neutral, PublicKeyToken=null' is not marked as serializable.

How do I set this up so I can save it?

In my web page I am doing:

public partial class AutoUPS : System.Web.UI.Page
{
private int exceptionDrop;
public static ClientList clientList = new ClientList();

...

protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
}
else
{
clientList = (ClientList)ViewState["ClientList"];
}
}

protected override void OnPreRender(EventArgs e)
{

base.OnPreRender(e);
ViewState["ClientList"] = clientList;
}

I am calling this from another page so I have my ClientList set as a static
and then want to save it so I don't have to call the database all the time.

Not sure if this is the best way but it seemed so.

Thanks,

Tom

To make the class serializable, you add the [Serializable()] attribute
to it. It also requires the class to have properties that are both
readable and writable, and the class needs a parameterless constructor
so that the deserializing can recreate an instance.

However, putting the list in ViewState means that you are sending the
serialized data to the browser and back, which makes it slower to load
and postback.

You could save the list in a Session variable, then it would not be sent
to the client. Consider the memory usage though, if you use too much
memory for each session that limits the number of session that the site
can handle. You may want the limitation to be how many requests the
server can handle per second rather than an absolute limit on the number
of visitors.
 
Göran Andersson said:
tshad said:
I have a page that is using a List collection (list<>) and I want to save
it across postbacks.

I tried adding it to my ViewState but get an error:

Type 'AutoUPS.ClientList' in Assembly 'AutoUPS, Version=1.0.0.0,
Culture=neutral, PublicKeyToken=null' is not marked as serializable.

How do I set this up so I can save it?

In my web page I am doing:

public partial class AutoUPS : System.Web.UI.Page
{
private int exceptionDrop;
public static ClientList clientList = new ClientList();

...

protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
}
else
{
clientList = (ClientList)ViewState["ClientList"];
}
}

protected override void OnPreRender(EventArgs e)
{

base.OnPreRender(e);
ViewState["ClientList"] = clientList;
}

I am calling this from another page so I have my ClientList set as a
static and then want to save it so I don't have to call the database all
the time.

Not sure if this is the best way but it seemed so.

Thanks,

Tom

To make the class serializable, you add the [Serializable()] attribute to
it. It also requires the class to have properties that are both readable
and writable, and the class needs a parameterless constructor so that the
deserializing can recreate an instance.

All the fields (3) are int or string.
However, putting the list in ViewState means that you are sending the
serialized data to the browser and back, which makes it slower to load and
postback.

I realize that, but I have a dropdown that has client names and clientIDs.
The problem is that I also need the account number to find a selection in
the dropdown (but only 2 values can be kept in a dropdown unless you
concatenate them but then you have another issue to deal with.

I just build a list<> with both the ID and Account# and if they put an
Account# (which is what they know) and then get the ClientID from the List<>
based on this Account# - I can then select the client in the dropdown. But
to do that I would need to keep the List said:
You could save the list in a Session variable, then it would not be sent
to the client. Consider the memory usage though, if you use too much
memory for each session that limits the number of session that the site
can handle. You may want the limitation to be how many requests the server
can handle per second rather than an absolute limit on the number of
visitors.

Also, you have a time problem if they keep the page open (this is an office
app) but don't do anything. You would lose the sesssion info.

Also, whether you keep the session on the page or in sessions, you still
need to pass the data around, right?

Thanks,

Tom
 
Back
Top