2012-11-21 25 views
1

我有一個使用Ajax Page Methods的頁面。首次加載頁面時,會提示用戶選擇一年。這是回發發生的唯一時間。年存儲在名爲SelectedYear的私有靜態頁面級整數屬性中。有幾種頁面方法可以將數據從客戶端傳遞到服務器,但年份總是存儲在服務器上,因此不必再次傳入數據。問題是,在少數情況下,在服務器WebMethod中,SelectedYear屬性似乎恢復爲0.我可以測試0並將錯誤返回給客戶端,但如果我能解釋它爲什麼會發生,這將有所幫助。在這一點上,我不知道。有任何想法嗎?我對這種編程風格有點新鮮。這是一個(非常簡化)代碼示例。用戶必須選擇一年才能達到保存功能。Ajax PageMethod訪問頁面級別的私有靜態屬性

這裏是我的C#服務器代碼:

public partial class Default : System.Web.UI.Page 
{ 
    private static int SelectedYear; 

    protected void YearSelected(object sender, EventArgs e) 
    { 
     if (sender.Equals(btnCurrentYear)) 
      SelectedYear = 2013; 
     else 
      SelectedYear = 2014; 
    } 

    [WebMethod] 
    public static bool Save(string FirstName, string LastName) 
    { 
     try 
     { 
      if (HttpContext.Current.User.Identity.IsAuthenticated) 
       //Right here, SelectedYear is sometimes 0. 
       SaveApplication(FirstName, LastName, SelectedYear); 
      else 
       throw new Exception("User is not logged in."); 
     } 
     catch (Exception ex) 
     { 
      throw; 
     } 
    } 
} 

這裏是我的JavaScript客戶端代碼:

function Save(FirstName, LastName) { 
    PageMethods.Save(firstName, LastName, SaveSucceeded, SaveFailed); 
} 

function SaveSucceeded(result) { 
    //Notify user that save succeeded. 
} 

function SaveFailed(error) { 
    //Notify user that save failed. 
} 

回答

1

你的問題是這樣的:

private static int SelectedYear; 

你要刪除static。靜態意味着它是全球性的,並將爲所有用戶/請求共享...因此,當您爲一位用戶將其設置爲2013,並且另一用戶點擊了尚未選擇一年的該頁面時,它將被設置爲0 .. 。對於他們倆。哎呀!

通過您的回傳追蹤您的AJAX方法期間發生了什麼變化。

您應該考慮將值存儲在會話變量中,或者可能存儲在頁面上的隱藏字段中。

上一個類似的職位更多閱讀:ASP.NET C# Static Variables are global?

+0

我想我會在今年存儲爲客戶端上的加密值在一個隱藏字段,你所提出的建議。會話可能會導致問題,因爲在生產環境中,此應用程序在具有三個節點的負載平衡器上運行(使用粘滯位,因此用戶不會經常被傳遞),並且我只能使用進程內會話。但是,這揭示了將選定的一年存儲在服務器上會產生相同的影響,無論是在會話中還是其他地方。謝謝你的解釋。我現在更瞭解一些事情。 – LJFraney