当我们使用Server.Transfer时,可以将先前页面中的Request参数一起传到下一页面。但如何将ViewState一起传过去呢?
主要方法是先将ViewState缓存起来,然后在通过缓存获取。缓存可以是Session等。
网上有人写了方法,主要是先将ViewState用方法返回。然后在调用页面中通过反身获取。与缓存原理类似。
主要方法是先将ViewState缓存起来,然后在通过缓存获取。缓存可以是Session等。
网上有人写了方法,主要是先将ViewState用方法返回。然后在调用页面中通过反身获取。与缓存原理类似。
例子如下:
Default.aspx页面:
增加一个ViewState,并添加返回ViewSate的ReturnViewState()方法,最后使用Server.Transfer跳转,代码如下:
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
ViewState["vId"] = "test";
Server.Transfer("Tra.aspx");
}
}
/// <summary>
/// 用此方法返回当前页面的ViewState
/// </summary>
/// <returns></returns>
public StateBag ReturnViewState()
{
return ViewState;
}
}
{
if (!IsPostBack)
{
ViewState["vId"] = "test";
Server.Transfer("Tra.aspx");
}
}
/// <summary>
/// 用此方法返回当前页面的ViewState
/// </summary>
/// <returns></returns>
public StateBag ReturnViewState()
{
return ViewState;
}
}
Tra.aspx页面:
在此页面通过反段得到先前页面的ViewState。
protected void Page_Load(object sender, EventArgs e)
{
InitialData();
}
/// <summary>
/// 通过反射得到ViewState,并显示
/// </summary>
private void InitialData()
{
if (null != PreviousPage)
{
Object objPreviousPage = (Object)PreviousPage;
MethodInfo objMethod = objPreviousPage.GetType().GetMethod("ReturnViewState");
if (objMethod != null)
{
StateBag viewStageBage = (StateBag)objMethod.Invoke(objPreviousPage, null);
if (viewStageBage != null)
{
if (null != viewStageBage["vId"])
{
Response.Write("vId:" + viewStageBage["vId"].ToString() + "<br/>");
}
}
}
}
}
{
InitialData();
}
/// <summary>
/// 通过反射得到ViewState,并显示
/// </summary>
private void InitialData()
{
if (null != PreviousPage)
{
Object objPreviousPage = (Object)PreviousPage;
MethodInfo objMethod = objPreviousPage.GetType().GetMethod("ReturnViewState");
if (objMethod != null)
{
StateBag viewStageBage = (StateBag)objMethod.Invoke(objPreviousPage, null);
if (viewStageBage != null)
{
if (null != viewStageBage["vId"])
{
Response.Write("vId:" + viewStageBage["vId"].ToString() + "<br/>");
}
}
}
}
}