2015-02-09 106 views
0

我有一對夫婦在一個受保護的類C#的變量,我使用存儲的最後座標點擊一個HTML畫布和變量是不改變的時候調用該方法:爲什麼不是這個靜態c#變量改變?

public partial class Default : Page { 

    public static int xVar {get; set;} 
    public static int yVar {get; set;} 

    protected void Page_Load(object sender, EventArgs e) { 
    } 

    protected string getDate() { 
     return Convert.ToString(DateTime.Now.Year); 
    } 

    [WebMethod] 
    protected void InsertPoints(int x, int y) { 
     xVar = x; 
     yVar = y; 
     //SQL Connect stuff and other code that works 
    } 
} 

的方法是從一個aspx頁面調用,它會調用它。問題是它將變量初始化爲零,並且無論我在Canvas中單擊哪個位置,它們都保持這種方式。事實上,當存在SQL插入時,它會插入正確的整數(x和y),但我無法獲取要更改的靜態變量。 謝謝。

+1

什麼是靜態變量?這些是實例屬性,所以它們只會在Web方法被調用時纔會持續,然後被拋出。除此之外,請小心使用ASP中的靜態內容。您可以遇到一些線程問題,以及靜態字段或屬性的多個實例。它變得混亂。只有在數據可能過期時才使用靜態。 – 2015-02-09 23:23:17

+0

沒有'靜態'變量可見。你有沒有顯示正確的代碼? – BradleyDotNET 2015-02-09 23:23:39

+1

線索名稱爲'static'。你必須聲明你的變量爲'static'。你沒有。每個請求都會構造一個新的「Page」,因此任何實例中的任何狀態都會被隨後的請求丟棄,並且每次都會處理一個全新的新構造的實例。 – spender 2015-02-09 23:23:41

回答

0

好的,我會從我在評論中瞭解到的內容中猜出。

我認爲在您用來解決問題的工作流程中存在錯誤。

什麼發生,它真的你的電話,這是否是你想到還是沒有什麼,就是你:

  1. 拼搶第一頁
  2. 點擊你的畫布,這會觸發對Web請求以更新靜態屬性。
  3. 預計alert呼叫將更新爲新的xCoord值。

這裏的關鍵是<%=...%>得到評估。當你第一次拉頁面時,就會發生對該表達式的評估,在你再次發起請求之前,它不會再被調用。

換句話說,alert('<%= xCoord %>')在頁面加載時被服務器端評估,瀏覽器得到最終的alert('0'),而不是一些神奇的鏈接到原始的靜態變量。

快速檢查這是刷新頁面。如果您:

  1. 單擊畫布,
  2. 刷新頁面,然後
  3. 再次單擊畫布,

應當正確更新。

您將能夠實現聽起來像您想要的功能的唯一方法是使用您推送到web方法的值,該方法僅適用於原始瀏覽器窗口,或者使用庫如SignalR來處理數據到所有連接的瀏覽器的實時下推。

讓我知道,如果我誤解了你的設置,或者如果我能澄清這一點。再一次,我的理解大部分只是你在評論中所說的一個推論。我知道這是,但你需要確認它是否與有關。


幾個人,包括我自己,在註釋中提到這一點,但我也會在這裏說。從我自己的意見,

小心使用ASP中的靜態東西。您可以遇到一些線程問題,以及靜態字段或屬性的多個實例。它變得混亂。只有在數據可能過期時才使用靜態。