[英]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:
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.