Ajax PageMethod访问页面级私有静态属性

时间:2012-11-21 16:28:24

标签: asp.net ajax webmethod

我有一个使用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.
}

1 个答案:

答案 0 :(得分:1)

你的问题是:

 private static int SelectedYear;

您需要删除static。静态意味着它是全局的,并且将为所有用户/请求共享...因此当您为一个用户将其设置为2013,而另一个用户点击尚未选择一年的该页面时,它将被设置为0 ..对于他们两个。糟糕!

通过回发追踪,看看在AJAX方法期间该变量发生了什么。

您应该考虑将值存储在会话变量中,也可以存储在页面上的隐藏字段中。

更多关于类似帖子的阅读:ASP.NET C# Static Variables are global?