Chào mừng đến với Diễn đàn lập trình - Cộng đồng lập trình.
Trang 1 của 2 12 CuốiCuối
Kết quả 1 đến 10 của 17
  1. #1
    Ngày tham gia
    Sep 2015
    Bài viết
    0

    Vấn đề Sesion ASP.NET

    Trong xử lí login mình có code lưu session khi nhấn vào button Login như sau:

    Mã:
                 if ( CheckLogin(txtUserID.Text,txtPassword.Text) == true )            {                Session["UserID"] = txtUserID.Text.Trim(); // ghi nhan session UserID                             }
    Sau đó, mình sử dụng Session đã lưu ở trên trong một class khác. Code như sau:

    Mã:
           public static string ID = HttpContext.Current.Session["UserID"].ToString(); // Thì Khi debug thì nó báo là không thấy Session trên. Mặc dù mình kiểm tra ở hàm xử lý login thì thấy session có giá trị.                    protected void Page_Unload(object sender, EventArgs e)        {            Session.Remove("UserID");            Session.RemoveAll();         }         protected void Page_Load(object sender, EventArgs e)        {                  }
    Trường hợp này mình không hiểu sao lại bị null. Mong mọi người đóng góp ạ.

  2. #2
    bạn cần phải kiểm tra Session có bị null không trước khi get nó về, bởi session tồn tại 1 time nhất định, có thể trong thời gian a bạn truy cập nó chưa die thì get về ko có lỗi nhưng đến time b thì nó đã die nên khi bạn get về đương nhiên sẽ bị null
    if( Session["UserID"] != null){
    public static string ID = HttpContext.Current.Session["UserID"].ToString();
    }

  3. #3
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Trích dẫn Gửi bởi duong2492
    bạn cần phải kiểm tra Session có bị null không trước khi get nó về, bởi session tồn tại 1 time nhất định, có thể trong thời gian a bạn truy cập nó chưa die thì get về ko có lỗi nhưng đến time b thì nó đã die nên khi bạn get về đương nhiên sẽ bị null
    if( Session["UserID"] != null){
    public static string ID = HttpContext.Current.Session["UserID"].ToString();
    }
    Cho hỏi sách nào dạy khai báo 1 field bên trong hàm if vậy? Lại còn mơ tưởng dùng Session bên ngoài thân của method. Mơ tưởng.

  4. #4
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    public static string ID = HttpContext.Current.Session["UserID"].ToString();

    Nhiều người sai lầm ở chỗ là là dùng static, static variable là shared variable. Những gì liên quan đến user base không nên dùng static.

    Nên dùng static variable cho những tình trạng như là: number of regsitered users, user onlines ... những gì mà tất cả user shared với nhau.

    Trong lệnh này không muốn blow up bạn có thể viết như sau:
    public static string ID = HttpContext.Current.Session["UserID"] + "";

    Mình khuyên nên sử dụng:
    public string ID = HttpContext.Current.Session["UserID"] + "";

  5. #5
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Nếu là người có kinh nghiệm thiết kế web sẽ không chỉ người khác gắn giá trị trực tiếp của 1 object ngay khi nó vừa khởi tạo.
    Mặc dù gắn trực tiếp vào nó vẫn nhận giá trị, nhưng chỉ có mấy thằng gà mờ nó mới làm như vậy.
    Cái này thuộc căn bản của C#.

    Vì sao?

    Khi mà không có bất kỳ liên kết nào trỏ tới class đó. Thì giá trị của biến nó vẫn mặc định như vậy. Không hề thay đổi.
    Ví dụ:

    Trường hợp của chủ topic là chứa UserID. Vậy khi user logout thì sao?
    Giả sử bạn quên xóa giá trị của Session, vậy giá trị của ID vẫn còn.
    Nếu bạn xóa giá trị của Session, vậy nó sẽ báo lỗi Object reference not set to an instance of an object.

    Một trong những nguyên tắc vàng khi học về C# là mọi thứ cần phải được khai báo rõ ràng trước khi sử dụng. Giống như vầy.


    Mã:
    public class MyClass{    public string ID {get; set; }    public MyClass(string id)    {        this.ID = id;    }} public class AnotherClass{    string temp = String.Empty;    temp = Session["UserId"].ToString();    MyClass mc = new MyClass(temp); }

  6. #6
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Mã:
    public class MyClass{    public string ID {get; set; }    public MyClass(string id)    {        this.ID = id;    }} public class AnotherClass{    string temp = String.Empty;    temp = Session["UserId"].ToString();    MyClass mc = new MyClass(temp); }
    Code của bác chỗ này: temp = Session["UserId"].ToString(); vẫn bị blow up như thường nhé \\\ null gọi tostring là blow up tè le hột me

    Cái này sách ViệtNam chỉ bác ? MyClass rồi AnotherClass ? Bác có biết là mỗi class bác làm là system bị chậm lại không? Mình không thấy lý do nào mà phải tạo class trong another class.

    Mình nghĩ sở dĩ bạn kia làm static, vì bạn ấy không muốn = new ClassCu?aBanAy() trong mỗi trang. Nhưng đã dùng static sai chổ

  7. #7
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Dọn lên sẵn cũng không biết đường ăn à?


    Mã:
    if (Session["UserID"] != null){//}
    Đấy. Cầm nĩa tay trái và dao tay phải nhé.

    Gộp chung lớp chứa dữ liệu nguồn với lớp gọi dữ liệu để thực thi lại chung 1 class?

    Dở hơi vừa thôi. Nói thế thì từ winform đến web chỉ cần duy nhất 1 class là đủ.
    Nói cứ như search google đọc mà k biết gì.

    Thậm chí có thể còn k biết tại sao Microsoft cho ra interface, abstract class, base class, struct...

  8. #8
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Session value bị mất khi Redirect??? Bạn chắc không?

  9. #9
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Trích dẫn Gửi bởi VNFox
    public static string ID = HttpContext.Current.Session["UserID"].ToString();

    Nhiều người sai lầm ở chỗ là là dùng static, static variable là shared variable. Những gì liên quan đến user base không nên dùng static.

    Nên dùng static variable cho những tình trạng như là: number of regsitered users, user onlines ... những gì mà tất cả user shared với nhau.

    Trong lệnh này không muốn blow up bạn có thể viết như sau:
    public static string ID = HttpContext.Current.Session["UserID"] + "";

    Mình khuyên nên sử dụng:
    public string ID = HttpContext.Current.Session["UserID"] + "";
    Đúng là không nên dùng static trong user base thật. Nhưng vì mình có hàm run background nên phải dùng static thôi( bất đắc dĩ nên vậy). Nhưng vấn đề không phải do static mà bị null. Mình đã tìm được lý do vì sao lại bị null rồi. Đó là đo khi login thành công mình có sử dụng Respone.redirect("abc.aspx") Nên session sẽ bị mất. Để khắc phục tình trạng này thì phải khai báo True khi có sử dụng redirect.Cụ thể là như vầy Respone.redirect("abc.aspx",true); Như thế thì Sesion sẽ không tự khởi tạo lại.
    - - - Nội dung đã được cập nhật ngày 22-06-2015 lúc 11:16 AM - - -

    Trích dẫn Gửi bởi villbe
    Nếu là người có kinh nghiệm thiết kế web sẽ không chỉ người khác gắn giá trị trực tiếp của 1 object ngay khi nó vừa khởi tạo.
    Mặc dù gắn trực tiếp vào nó vẫn nhận giá trị, nhưng chỉ có mấy thằng gà mờ nó mới làm như vậy.
    Cái này thuộc căn bản của C#.

    Vì sao?

    Khi mà không có bất kỳ liên kết nào trỏ tới class đó. Thì giá trị của biến nó vẫn mặc định như vậy. Không hề thay đổi.
    Ví dụ:

    Trường hợp của chủ topic là chứa UserID. Vậy khi user logout thì sao?
    Giả sử bạn quên xóa giá trị của Session, vậy giá trị của ID vẫn còn.
    Nếu bạn xóa giá trị của Session, vậy nó sẽ báo lỗi Object reference not set to an instance of an object.

    Một trong những nguyên tắc vàng khi học về C# là mọi thứ cần phải được khai báo rõ ràng trước khi sử dụng. Giống như vầy.


    Mã:
    public class MyClass{    public string ID {get; set; }    public MyClass(string id)    {        this.ID = id;    }} public class AnotherClass{    string temp = String.Empty;    temp = Session["UserId"].ToString();    MyClass mc = new MyClass(temp); }
    Bác này kiến thức rất tốt, nhưng bị lạc đề [IMG]images/smilies/smile.png[/IMG]

    - - - Nội dung đã được cập nhật ngày 22-06-2015 lúc 11:18 AM - - -

    Trích dẫn Gửi bởi duong2492
    bạn cần phải kiểm tra Session có bị null không trước khi get nó về, bởi session tồn tại 1 time nhất định, có thể trong thời gian a bạn truy cập nó chưa die thì get về ko có lỗi nhưng đến time b thì nó đã die nên khi bạn get về đương nhiên sẽ bị null
    if( Session["UserID"] != null){
    public static string ID = HttpContext.Current.Session["UserID"].ToString();
    }
    Bạn này chắc viết nhằm nên sai cú pháp. Nhưng mình hiểu ý bạn.

  10. #10
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Trích dẫn Gửi bởi VNFox
    Hmm ... cái này chắc không đúng. Session chỉ mất khi bạn reset thôi hoặc Session[variable] = null;

    Cho dù redirect 10 lần đi nữa Session cũng sẽ không mất. Chắc có chổ nào lỗi trong code rồi, kiểm tra lại đi
    Mình đã test thử nên mới phát hiện và biết nguyên nhân vì sao sesion lại bị mất value. kiểm tra đủ thứ rốt cuộc mới phát hiện là do redirect 2 lần. Mình cũng không nghĩ là session sẽ mất value khi bị redirect đâu. nhưng thật sự nó đã mất.

 

 
Trang 1 của 2 12 CuốiCuối

Quyền viết bài

  • Bạn Không thể gửi Chủ đề mới
  • Bạn Không thể Gửi trả lời
  • Bạn Không thể Gửi file đính kèm
  • Bạn Không thể Sửa bài viết của mình
  •