阿弦 發問時間: 電腦與網際網路程式設計 · 1 0 年前

關於ASP.NET SESSION 的問題 (會員資料修改)

我想在會員登入之後

可以去抓資料庫的會員資料 顯示在會員專區裡面

然後是以textbox的形式顯現出來 這樣可以讓會員看到自己的資料的同時 也能手動做修改 按下"修改"按鈕即可連結資料庫作update的動作

update之後 textbox就會顯示出我修改過後的樣子

一切只有textbox裡面的值在做修改

不曉得各位大大是否聽得懂我的描述

好了 以下是程式碼

其實我的網頁很簡單 (只是放比較重要的)

------------------以下是login的程式碼---------------------------

protected void Button1_login_Click(object sender, EventArgs e)

{

SqlConnection Conn = new SqlConnection();

Conn.ConnectionString = WebConfigurationManager.ConnectionStrings["寫在webconfig裡面的ConnectionString"].ConnectionString;

SqlDataReader dr = null;

SqlCommand cmd = new SqlCommand("select * from CustomerDataTable where CustomerName = '" + Cus_TB.Text + "' and Password = '" + PsW_TB.Text + "'", Conn);

Session["U1"] = dr["CustomerName"].ToString(); //--通過帳號與密碼的認證,就獲得 Session。

Session["U2"] = dr["Password"].ToString();

Session["U3"] = dr["CustomerLevel"].ToString();

Session["U4"] = dr["Email"].ToString();

Session["U5"] = dr["CellPhoneNum"].ToString();

Session["Login"] = "OK";

(以下省略 只是在做關閉的動作)

}

---------------------接著是會員專區首頁(MemberDefault的程式碼)-------------

protected void Page_Load(object sender, EventArgs e)

{

Name_Lable.Text = (String)Session["U1"];

Email_TB.Text = (String)Session["U4"];

CellPhone_TB.Text = (String)Session["U5"];

}

最重要的按鈕沒辦法PO 因為字數限制的關係

我用補充PO上來

已更新項目:

protected void Button1_Click(object sender, EventArgs e)

{

SqlDataSource SqlDataSource2 = new SqlDataSource();

SqlDataSource2.ConnectionString = System.Web.Configuration.WebConfigurationManager.ConnectionStrings["寫在webconfig裡面的ConnectionString"].ConnectionString;

2 個已更新項目:

SqlDataSource2.UpdateParameters.Add("CustomerName", Label1.Text);

SqlDataSource2.UpdateParameters.Add("Email", Email_TB.Text);

SqlDataSource2.UpdateParameters.Add("CellPhoneNum", CellPhone_TB.Text);

3 個已更新項目:

SqlDataSource2.UpdateCommand = "Update CustomerDataTable SET Email = @Email, CellPhoneNum = @CellPhoneNum Where CustomerName =@CustomerName";

SqlDataSource2.Update();

}

4 個已更新項目:

後我的問題是

我這樣似乎沒有辦法在按下按鈕後

資料可以做修改

似乎不會存到資料庫

後來我發現我的update的字串沒有錯

好像是Session的問題

因為如果我把會員專區首頁的Page_Load()裡面的

Email_TB.Text = (String)Session["U4"];

CellPhone_TB.Text = (String)Session["U5"];

註解掉 那我的按鈕按下去就會生效 他會連到資料庫並修改

所以我判斷應該是Session的問題

可是這樣我就沒辦法在登入時 textbox上面就立即顯示會員的資料

請大大幫我解決這個問題 謝謝

15點奉上了

5 個已更新項目:

說錯 是10點= =

我本來想給15點 可是我好像按到10點= ="

真是不好意思XD

6 個已更新項目:

回jerry

我照你的方法

將那三行放進Page_Prerender裡面

我一登入後

可以讀到我資料庫的資料

但當我按下修改

頁面上顯示的卻一樣是我第一次登入進來的那個資料

沒有隨著按下按鈕而修改

但我的資料庫卻是有修改到

然後我再做登出 登入一次

頁面上就顯示了修改過後的資料

總而言之

當我按下修改後 頁面上就始終顯示一開始登入進來的資料

而當我登出 把所有session abandon掉之後

再登入一次才會顯示修改過的資料

請問這該要如何解決?

7 個已更新項目:

TO mis2000***

可能您沒有看清楚我的問題內容

因為發問問題會有字數限制

所以為求簡便我就放了比較重要的程式碼

由於關閉的動作 語法都相同

所以我才沒有打上去...

8 個已更新項目:

To mis2000***

我有看過您的那個範例

有載您的光碟裡面看過cs的檔

裡面您的資料修改是用SqlDataSource去連結資料庫

並且使用formView去顯示資料

但是我使用的是ADO.NET

所以用法和您的不同 也因此我沒辦法從您的那個範例去找出我要的答案

但我從另外一個您第2章的login proflie的1_profile.aspx.vb檔案去看了範例的才找出我要的答案

我只是session和按鈕搞不太清楚

但是我又做了以下修改就完成了!

9 個已更新項目:

我把Page_Load的

Name_Lable.Text = (String)Session["U1"];

Email_TB.Text = (String)Session["U4"];

CellPhone_TB.Text = (String)Session["U5"];

放在Page_Prerender裡

10 個已更新項目:

然後在按鈕裡

Session["U1"] = Name_Lable.Text;

Session["U4"] = Email_TB.Text;

Session["U5"] = CellPhone_TB.Text;

就能順利修改了

不過還是不太了解為什麼就是...

3 個解答

評分
  • 1 0 年前
    最佳解答

    我直接點出您的問題

    按鈕事件,仍會排在page_load之後,

    因此您每次在TEXTBOX修改了資料,按下按鈕後,PAGE_LOAD()仍會先被執行,因此TEXTBOX的值又被SESSION蓋了回去

    好了,以下請修正2個地方

    1.請把PAGE_LOAD的程式加上IF句,讓它只有第一次頁面被執行時才發生作用

    protected void Page_Load(object sender, EventArgs e)

    {

    If ( ! Page.IsPostBack)

    {

    Name_Lable.Text = (String)Session["U1"];

    Email_TB.Text = (String)Session["U4"];

    CellPhone_TB.Text = (String)Session["U5"];

    }

    }

    2.按鈕事件後,請把session的值更新

    protected void Button1_Click(object sender, EventArgs e)

    {

    您原本的程式碼不動,最後再加上

    Session["U1"] = Name_Lable.Text;

    Session["U4"] = Email_TB.Text;

    Session["U5"] = CellPhone_TB.Text;

    }

    2010-08-11 10:37:05 補充:

    以下補充一下Session與Application的觀念

    Session是每一個單一瀏覽器視窗內,同一個網站或虛擬目錄中的程式頁面,皆可以共用存取的變數,它與瀏覽器的cookies有很大的關聯(此部份原理先不用太深究)

    Application是同一個網站或虛擬目錄中的程式頁面,皆可以共用存取的變數,不論有多少便用者連上這個網站或虛擬目錄都可以共用的

    2010-08-11 10:37:09 補充:

    自然狀況下,Session什麼時候會失效?

    IIS預設值為20分鐘,而您也沒有特別在程式中指定Session.Timeout時間時,預設就是20分鐘內,網頁都沒有執行任何動作時,Session會失效

    當使用者本身把瀏覽器關閉後,2分鐘以內在server端的session也會失效

    Application什麼時候會失效?

    當所有使用者的Session都失效時,Application會自動回收資源.失效.

  • 1 0 年前

    您說是從我這個範例看到、並且修改的

    http://www.dotblogs.com.tw/mis2000lab/archive/2008...

    同一系列(關於會員登入)下一篇文章有完整範例可以下載,你沒看嗎??????

    這個範例看了,應該多少有幫助啊。您先研究一下,再來討論

    我寫了一個範例給大家參考,請看---- [習題]會員登入、會員專屬網頁、會員修改私人資料,怎麼寫?(#2 範例篇)

    .....................................................................................

    您的問題很亂,我看不太懂。

    但我書本的下集,有一個完整範例,基本上把登入、會員權限、修改資料....都公開了。

    您不買也OK,去圖書館借來看,或是去書店翻翻看。

    因為您基礎比較弱,我不知道該花多少時間才能讓您100%都懂

    你的程式也很怪,是從哪裡COPY來兜的啊?缺少了這一部份呢--

    http://www.dotblogs.com.tw/mis2000lab/archive/2010...

    資源使用之後,也都沒有動手關閉......

    我寫書,寫BLOG就是要分享我的知識與經驗,如果這樣您都不願意看,那....我該怎麼幫你?

    要速成,救用現成的精靈,寫程式比較花功夫(但變化較多)

    如果有心學的話,慢慢來。

    你要先把基礎學好,我們(網路上的朋友)才能在旁邊提點你,讓你更進步。

    如果你的基礎比較不扎實,網路上三言兩語真的幫不上忙、使不上力啊~

    書本圖文並茂,真的才是「自修」的正式途徑

    2010-08-08 16:32:31 補充:

    Session就是一個共用的變數

    您後來修改成功的版本

    不就是一般的作法?

    賦予 Session一個「值」

    如您所寫:

    Name_Lable.Text = (String)Session["U1"];

    Email_TB.Text = (String)Session["U4"];

    CellPhone_TB.Text = (String)Session["U5"];

    2010-08-08 16:32:36 補充:

    修改 Session裡面的值

    如您所寫:

    Session["U1"] = Name_Lable.Text; (把User輸入的值,放進 Session裡面而已)

    Session["U4"] = Email_TB.Text;

    Session["U5"] = CellPhone_TB.Text;

    這有什麼難的呢?不難吧?

    2010-08-08 16:34:16 補充:

    ************************

    喔!!!!我的天啊!

    您沒看過我的上集,直接看下集的書,對嗎?

    ************************

    難怪您對 Session不熟悉

    這東西很簡單

    您不用買書,去圖書館借閱、或是書店翻一下就好了

    (上集第十六章,直接看 Session就好)

    不要四處拼湊程式,對您自己的學習,很不好喔

    2010-08-08 16:36:59 補充:

    您的 Page_Load事件

    最好也參考一下 IsPostBack屬性的作法

    Page_Load是一個很特別的事件

    你按下任何按鈕,都會重複觸發他喔

    當您按下 Button按鈕,你以為只會執行 Button_click()事件嗎?

    錯了,他一樣會觸發 Page_Load事件喔

    建議您參考一下這個範例

    http://www.dotblogs.com.tw/mis2000lab/archive/2009...

    很多很重要的 ASP.NET觀念,您都尚未具備喔...

    2010-08-10 16:36:30 補充:

    底下這位網友,回答者: 神之怒雷

    答案一級棒!!!!!!

    To 原發問者:

    您還是從基礎學起吧

    好多東西都很欠缺呢。

    光是 IsPostBack(asp.net 網頁的生命週期),你都還不懂

  • 1 0 年前

    protected void Page_Load(object sender, EventArgs e)

    {

    Name_Lable.Text = (String)Session["U1"];

    Email_TB.Text = (String)Session["U4"];

    CellPhone_TB.Text = (String)Session["U5"];

    }

    這一段應該要放到 Page_Prerender中

    因為網頁上面的程式, 是透過 PostBack來完成

    也就是當你按下按鈕時, 會重新回送到伺服器, 而並不是

    直接執行 Button_Click 的動作

    也因此, 會先執行

    Page_Load

    Button_Click

    Page_Prerender

    而你的程式在Page_Load將就的資料先寫道 TextBox中,

    可是在Button_Click中才作寫入資料的動作

還有問題?馬上發問,尋求解答。