Поскольку, кажется, нет более элегантного способа решить эту проблему, я внедрил следующий код в базовый класс страниц, от которого наследуются все мои веб-формы:
/// <summary>
/// Set an ID to identify the correct session variable (in case there are several ones).
/// Create this ID when it is needed for the first time.
/// </summary>
private string PageCallID
{
get
{
if (ViewState["PageCallID"] == null) ViewState["PageCallID"] = Guid.NewGuid().ToString("N");
return ViewState["PageCallID"].ToString();
}
}
/// <summary>
/// Use a hashtable which is stored into the Session to save the in-memory
/// objects. This helps to keep the viewstate variable at the client small.
/// </summary>
protected Hashtable ServerViewState
{
get
{
string strSessionKey = String.Format("CleverViewState_{0}", PageCallID);
if (Session[strSessionKey] == null) Session[strSessionKey] = new Hashtable();
return (Hashtable)Session[strSessionKey];
}
}
При этом мы можем написать в любой веб-форме:
ServerViewState["MyDataTable"] = myDataTable;
вместо
ViewState["MyDataTable"] = myDataTable;
Однако это решение нельзя вызвать статическим методом. Поэтому я думаю, что это скорее обходной путь, чем решение.
Если кто-нибудь знает лучший способ решить эту проблему, я был бы благодарен за любые отзывы!