如何将Viewstate值从一个aspx页面传递到另一个页面?

时间:2012-02-10 09:04:16

标签: asp.net viewstate

实际上我正在使用视图状态将值从一个页面发送到另一个页面,如果是,那么我们可以这样做吗。我只想用viewstate做其他技术,比如coockie或querystring?

6 个答案:

答案 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)

  1. 在源页面上创建一个返回viewstate值的公共属性。
  2. 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();