我们来学习如何在页面间传递信息,首先我们来看第一种方法,这种方法很常用,

--------------------------------------------------------------------------------

1.QueryString
使用这种分方法有几点需要注意:
参数限制于简单的字符串.
参数是明文传输且对于用户是开放的,安全性不高.
参数的长度限制于1-2kb.
.net 2.0不支持,需要你手工的传递,方法是Response.Redirect("newPage.aspx?num ="+num.tostring());如果要传输多个参数在参数之间加上"&"还有一个如果的string中含有不合法的字符但是你还是需要传输,那么就要使用Server.URLEncode(stringname);
读取参数是更据参数的名称:Request.QueryString["num"];

--------------------------------------------------------------------------------
第二中使用方法为Cross-Page posting
页面之间,ASP.NET使用了一种"PostBackURL"技术,不过只限制于在Button control中使用(LinkButton,ImageButton).
<ASP:Button ID="Btn_CrossPage" Runat = "Server" PostBackUrl = "Crosspage.aspx">
的二张页面中的所有函数Page_load事件都会被强制的载入。

Protected  void Page_load(Object sender,EventArgs e)
{
   if(PreviousPage != null)
      {
          lblinfo.Text = "You came a page from "+PreviousPage.Header.Title;
       }
}

--------------------------------------------------------------------------------
如果你想访问页面的controls,你需要将类型显示的申明为页面名称

Protected void Page_load(Object sender,EventArgs e)
{
    if(PreviousPage != null)
       {
          Crosspage1 prevpage = PreviousPage as Crosspage1;
            if(prevpage != null)
                {//Any code}
        }
}


经过以上这步后你还是不可以完全的访问,因为变量是保护类型的,所以你必须在申明一个共有的成员函数.

Public String GetName()
{
    get{return txt1.Text+txt2.Text};
}


如果你想在任何controls中使用Cross-posting,那么你可以使用Server.Tranfer(),它会将页面的Viewstate全部的放过去,我们如何鉴别是那种方式?if(PreviousPage.IsCrossPageBack)就可以解决.

--------------------------------------------------------------------------------
下面我们来看一个简单的Example:
我们知道页面验证controls 很好的保证了用户的输入是合法的,但是我们要考虑到一下情况:用户Broswer不支持JavaScript,那么我们的页面很有可能被攻击,那么我们就可以利用Crosspage来解决.

page1.aspx------------------------------------------
Public void Page_load(Object sender,EventArgs e)
{
    if(!Request["err"] != null)
         {
             Page.Validate();
         }
}
page2.aspx------------------------------------------
Public void Page_load(Object sender,EventArgs e)
{
   if(!PreviousPage.isValid)
   {
       Server.Redirect("Page1.aspx?"+"err=true");
    }
}


--------------------------------------------------
Custome Cookies第三种方法
在使用之前必须导入包:System,Net,使用起来很简单,页面默认包含一个Cookies集合,我们需要作的是在页面申明

HttpCookies coo = new HttpCookie("Preference");
Cookie["Var"] = "numeber";
Responese.Cookie.Add(coo);
Cookie.Expries = DataTime.Now.AddYears(1);
==========================================
HttpCookies cooo = Request.Cookie["Preference"];
if(cooo != null)
{num = Cookies["Var"];}


-----------------------------------------------------
第四种方法 重量级 Session State

--------------------------------------------------------------------------------
在电子商务使用的比较的多,用户的数据不会因为在页面之间切换被销毁掉
,但是他比较耗资源,首先我们来看一下

--------------------------------------------------------------------------------
Session Architecture
ASP.net使用了一种120-bit唯一的标识符在页面之间传输,注意只有你在使用Session时,他才被固定下来,否则他时会改变的在页面更新时.
下面我们来看一下Example
我们存放一个DateSet对象在SessionMemorry中,
Session["ds"] = DS;
你可以显示的得到他:
DS = (DateSet)Session["ds"];
下面我们来看一下Session State的配置(在Web.conf文件中)

<sessionState
mode="InProc"
stateConnectionString="tcpip=127.0.0.1:42424" stateNetworkTimeout="10"
sqlConnectionString="data source=127.0.0.1;Integrated Security=SSPI"
sqlCommandTimeout="30" allowCustomSqlDatabase="false"
useHostingIdentity="true"
cookieless="UseCookies" cookieName="ASP.NET_SessionId"
regenerateExpiredSessionId="false"
timeout="20"
customProvider=""
/>


mode:表示Session保存的地方,OFF:不使用,InProc:旨在但前Domain中保存,StateServer,Sqlserver.Cookiesness可以保护你的参数加密化.

--------------------------------------------------------------------------------
相对的我们可以使用让所有人使用的Application[""]State.

protected void Page_Load(Object sender, EventArgs e)
{
int count = (int)Application["HitCounterForOrderPage"];
count++;
Application["HitCounterForOrderPage"] = count;
lblCounter.Text = count.ToString();
}