2012-11-21 26 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