關於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;
SqlDataSource2.UpdateParameters.Add("CustomerName", Label1.Text);
SqlDataSource2.UpdateParameters.Add("Email", Email_TB.Text);
SqlDataSource2.UpdateParameters.Add("CellPhoneNum", CellPhone_TB.Text);
SqlDataSource2.UpdateCommand = "Update CustomerDataTable SET Email = @Email, CellPhoneNum = @CellPhoneNum Where CustomerName =@CustomerName";
SqlDataSource2.Update();
}
後我的問題是
我這樣似乎沒有辦法在按下按鈕後
資料可以做修改
似乎不會存到資料庫
後來我發現我的update的字串沒有錯
好像是Session的問題
因為如果我把會員專區首頁的Page_Load()裡面的
Email_TB.Text = (String)Session["U4"];
CellPhone_TB.Text = (String)Session["U5"];
註解掉 那我的按鈕按下去就會生效 他會連到資料庫並修改
所以我判斷應該是Session的問題
可是這樣我就沒辦法在登入時 textbox上面就立即顯示會員的資料
請大大幫我解決這個問題 謝謝
15點奉上了
說錯 是10點= =
我本來想給15點 可是我好像按到10點= ="
真是不好意思XD
回jerry
我照你的方法
將那三行放進Page_Prerender裡面
我一登入後
可以讀到我資料庫的資料
但當我按下修改
頁面上顯示的卻一樣是我第一次登入進來的那個資料
沒有隨著按下按鈕而修改
但我的資料庫卻是有修改到
然後我再做登出 登入一次
頁面上就顯示了修改過後的資料
總而言之
當我按下修改後 頁面上就始終顯示一開始登入進來的資料
而當我登出 把所有session abandon掉之後
再登入一次才會顯示修改過的資料
請問這該要如何解決?
TO mis2000***
可能您沒有看清楚我的問題內容
因為發問問題會有字數限制
所以為求簡便我就放了比較重要的程式碼
由於關閉的動作 語法都相同
所以我才沒有打上去...
To mis2000***
我有看過您的那個範例
有載您的光碟裡面看過cs的檔
裡面您的資料修改是用SqlDataSource去連結資料庫
並且使用formView去顯示資料
但是我使用的是ADO.NET
所以用法和您的不同 也因此我沒辦法從您的那個範例去找出我要的答案
但我從另外一個您第2章的login proflie的1_profile.aspx.vb檔案去看了範例的才找出我要的答案
我只是session和按鈕搞不太清楚
但是我又做了以下修改就完成了!
我把Page_Load的
Name_Lable.Text = (String)Session["U1"];
Email_TB.Text = (String)Session["U4"];
CellPhone_TB.Text = (String)Session["U5"];
放在Page_Prerender裡
然後在按鈕裡
放
Session["U1"] = Name_Lable.Text;
Session["U4"] = Email_TB.Text;
Session["U5"] = CellPhone_TB.Text;
就能順利修改了
不過還是不太了解為什麼就是...
3 個解答
- 神之怒雷Lv 41 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會自動回收資源.失效.
- ASP.NET網頁程式Lv 71 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中才作寫入資料的動作