实际上我正在使用视图状态将值从一个页面发送到另一个页面,如果是,那么我们可以这样做吗。我只想用viewstate做其他技术,比如coockie或querystring?
答案 0 :(得分:5)
如果您只想使用viewstate将数据发送到下一页,那么您应该使用server.transfer()
方法而不是resposnse.redirect()
方法。我们假设我们想要点击按钮时传递viewstate
,如下所示:
public void btnSer_OnClick(object sender, EventArgs e)
{
ViewState["yourvalue"] = "Name";
ViewState["yourcity"] = "Shimla";
Server.Transfer("Default.aspx");
}
在同一页面上创建一个类statebag
的方法 public StateBag ReturnViewState()
{
return ViewState;
}
现在,在您要转移的页面上,请点击Default.aspx。将以下函数放在Default.aspx.cs文件中
private StateBag PreviousPageViewState
{
get
{
StateBag returnValue = null;
if (PreviousPage != null)
{
Object objPreviousPage = (Object)PreviousPage;
MethodInfo objMethod = objPreviousPage.GetType().GetMethod("ReturnViewState");//System.Reflection class
return (StateBag)objMethod.Invoke(objPreviousPage, null);
}
return returnValue;
}
}
现在让我们找到上一页的viewstate
的值(ViewState["yourvalue"]
和ViewState["yourcity"]
)
让我们在Default.aspx
的页面加载时执行此操作 protected void Page_Load(object sender, EventArgs e)
{
if (PreviousPage != null && PreviousPageViewState != null)
{
var sg = PreviousPageViewState["yourvalue"].ToString();
var nev = PreviousPageViewState["yourcity"].ToString();
}
}
所以我们完成了。您可以访问上一页的viewstate
值。
答案 1 :(得分:2)
您可以通过三种方式从上一页检索数据。
<强>一项PostBackUrl 强>
在您的第一页/表单(First.aspx.cs)上创建一个包含列表框的公共属性:
public TextBox PostedTextBox { get { return TextBox1; } }
将按钮的postback-url设置为Second.aspx
@ Page-directive add之后的aspx文件中的第二页:
<%@ PreviousPageType VirtualPath="~/First.aspx" %>
然后在Second.aspx.cs的Form_Load中,您可以提取值:
if (PreviousPage != null)
{
TextBox postedTextBox = PreviousPage.PostedTextBox;
//...
}
使用PreviousPage
找到控件/数据您可以使用以下方法找到控件:
if (PreviousPage != null)
{
var control = PreviousPage.FindControl("ListBox1") as ListBox;
}
申请表单数据
您可以使用GetValues:
Request.Form.GetValues("ctl00$MainContent$ListBox1");
返回包含每个所选项的字符串数组。
答案 2 :(得分:1)
您可以通过向按钮添加PostBackUrl
来处理跨页回发。我们假设我们从第A页发布到第B页。您可以订阅A按钮的Click
事件并填充A的公共财产:
MyPublicProperty = ViewState["MyInfo"];
您现在可以在B中使用Page.PreviousPage
来访问A MyPublicProperty
。只需检查PreviousPage
是否为null,然后将其转换为A类型。
我知道这并没有从字面上转移视图状态,而且我对我的一些代码中的解决方案说实话并不太满意,但这是一种交叉发布视图状态信息的方法。
答案 3 :(得分:0)
“仅在页面中使用Viewstate非常有用”。如果您想在页面中维护,请使用“会话”
ex:in c#
Session["name"] ="the value that maintain";
答案 4 :(得分:0)
e.g:
namespace MyNameSpace
{
public class SourcePageClassName
{
public string MyValue
{
get
{
if ( this.ViewState("MyViewStateValue") == null )
{
this.ViewState("MyViewStateValue") = "default value";
}
return this.ViewState("MyViewStateValue").ToString();
}
set
{
this.ViewState("MyViewStateValue") = value;
}
}
}
}
2. do a Server.Transfer to the destination page.
e.g.:
Server.Transfer("Destination.aspx")
3. On the destination page, on the page load event, I check whether the Context.Current.Handler is of the type of the source page and if it's then I cast it and read the property
e.g.:
...
protected void Page_Load(object sender, System.EventArgs e)
{
if ( Context.Current.Handler != null && Context.Current.Handler.GetType() == typeof(SourcePageClassName) )
{
SourcePageClassName source = Context.Current.Handler as SourcePageClassName;
System.Diagnostics.Debug.WriteLine(source.MyValue);
}
}
就是这样......
在ASP.NET 2.0上你可以做同样的事情或做一个交叉回发创建我在第1步中提到的属性
答案 5 :(得分:0)
您无法直接从另一个表单访问一个表单的ViewState。
但是我们可以在Context集合中传递值,然后在另一个页面中访问该值。
Form1中:
Context.Items.Add ( "MyVar" , ViewState["yourvalue"].ToString() );
窗体2:
string myValue = Context.Items["MyVar"].ToString();