我有一个使用Ajax页面方法的页面。首次加载页面时,系统会提示用户选择一年。这是PostBack发生的唯一时间。年份存储在名为SelectedYear的专用静态页面级整数属性中。有几种页面方法可以将数据从客户端传递到服务器,但是年份始终存储在服务器上,因此不必再次传入。问题是,在少数情况下,在服务器WebMethod中,SelectedYear属性似乎恢复为0.我可以测试0并将错误返回给客户端,但如果我能解释它为什么会发生,它会有所帮助。此时,我不知道。有任何想法吗?我对这种编程方式有点新意。这是代码的一个(非常简化的)示例。用户必须选择一年才能达到保存功能。
这是我的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.
}
答案 0 :(得分:1)
你的问题是:
private static int SelectedYear;
您需要删除static
。静态意味着它是全局的,并且将为所有用户/请求共享...因此当您为一个用户将其设置为2013,而另一个用户点击尚未选择一年的该页面时,它将被设置为0 ..对于他们两个。糟糕!
通过回发追踪,看看在AJAX方法期间该变量发生了什么。
您应该考虑将值存储在会话变量中,也可以存储在页面上的隐藏字段中。
更多关于类似帖子的阅读:ASP.NET C# Static Variables are global?