1

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

1 回答 1

1

你的问题是这样的:

 private static int SelectedYear;

您将要删除static. 静态意味着它是全局的,将为所有用户/请求共享......所以当你为一个用户将它设置为 2013 时,另一个用户点击尚未选择年份的页面,它将被设置为 0.. . 对于他们俩。哎呀!

跟踪您的回发以查看在您的 AJAX 方法期间该变量发生了什么。

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

更多阅读类似帖子:ASP.NET C# 静态变量是全局的?

于 2012-11-21T16:35:05.670 回答