2015-02-09 107 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中的静态东西。您可以遇到一些线程问题,以及静态字段或属性的多个实例。它变得混乱。只有在数据可能过期时才使用静态。