簡體   English   中英

可從所有頁面訪問屬性,但每個會話僅更改一次

[英]Property accessible from all pages but change only once per session

我認為標題不是我所遇到問題的最好描述,但是問題如下:

我有一個像這樣的基類:

  public class BasePage : System.Web.UI.Page
    {
         public static ProjectDTO Project { get; set; }
         // some other code

         // Setting the project once per session.
         public void SetProject()
         {

           Project = (ProjectDTO)HttpContext.Current.Session["Project"];
           SiteMaster masterPage = Master as SiteMaster;
           masterPage.Project = Project;
         }

    }

然后我有一個aspx頁面,如:

public partial class SomePage: BasePage
{
    protected void Page_Load(object sender, EventArgs e)
    {
     //callling the base method to set the project
       SetProject();
    }

    //some db method which requires the Project.Id property.
    GetSomeInfo(Project.Id)
    {
    //irelevant code
    }

}

一切正常,但是,當我同時有2個用戶在線時,他們顯然將調用SetProject方法,並且如果其中之一使用GetSomeInfo方法,則Project.Id屬性將是最新的一組,而不是最新的一組當前的用戶會話。

誰能幫我解決這個問題?

PS:

  • 骯臟的解決方法是每次我必須使用Project時都讀取會話變量,這不會有問題,但是我的頁面有10種需要該屬性的方法(很多冗余代碼)
  • 第二個解決方法是在SomePage上聲明一個公共屬性並使用它,但是,我會發現BasePage Project是多余的,我不喜歡這種方法,因為有很多頁面需要Project屬性並使用BasePage (對屬於該項目的對象進行過濾,搜索等)

編輯經過更多測試,同時有2個不同的用戶,並且在Glubus注釋之后,僅當為其中一個用戶加載頁面時才會發生此問題(未加載任何內容的用戶將從數據庫中獲取錯誤的結果,而其他用戶正在加載頁面。)

EDIT2工作流程如下:用戶轉到主頁,其中有可用的項目列表(從數據庫讀取)->單擊一個項目(當用戶單擊項目時,我正在設置會話變量以供以后讀取)。 然后,用戶可以查看/使用與此項目相關的其他數據。

EDIT3當用戶單擊項目時,他們將導航到“ Dashboard頁面。 在這里,我甚至在Page_Load設置會話變量,例如:

public partial class Dashboard : BasePage
{
  protected void Page_Load(object sender, EventArgs e)
    {
        int projectId;
        int.TryParse(Request.QueryString["projectId"], out projectId);
        if (projectId > 0)
            {
                Session["Project"] = ProjectSvc.GetProjectById(projectId);
                SetProject();
            }
    }
}

ProjectDTO類:

public class ProjectDTO
    {
        public int idProject { get; set; }

        public string Title { get; set; }

        public string Users { get; set; }

        public string Description { get; set; }

    }

我將Project設置為Site Master因為我有一個標簽,需要在屏幕上顯示Project名稱和說明。

也許是最壞情況的解決方案-但是...如果您真的打算使所有后續用戶都可以訪問Project變量,則可能需要退出會話並將其聲明為靜態變量?

這樣,它將在整個應用程序范圍內共享,並保留最后分配的值。

為了從包括WebMethods在內的所有位置從當前Session訪問Project,請在BasePage中聲明一個靜態只讀屬性,該屬性直接訪問Session。

public class BasePage : System.Web.UI.Page
{
             public static ProjectDTO Project 
             { 
                get {return (ProjectDTO)HttpContext.Current.Session["Project"];}
             }
             // some other code

             // Passing the Project to the Master.
             public void SetProject()
             {
               SiteMaster masterPage = Master as SiteMaster;
               masterPage.Project = Project;
             }
}

如果還使用BasePage.Project從Site Master訪問當前項目,則可以完全擺脫SetProject()調用。

在測試過程中,請確保未使用相同的瀏覽器實例進行測試。 當通過cookie進行會話管理並且您有兩個用戶登錄到同一瀏覽器實例時,他們實際上將使用相同的ASP.net會話。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM