Ajax PageMethod accessing page-level private static property

自作多情 提交于 2019-12-11 12:09:44

问题


I have a page that uses Ajax Page Methods. When the page first loads, the user is prompted to select a year. This is the only time that a PostBack occurs. The year is stored in a private static page-level integer property named SelectedYear. There are several page methods that pass data from the client to the server, but the year is always stored on the server, so that it won't have to be to be passed in again. The problem is, in a few cases, within the server WebMethod, the SelectedYear property seems to be reverting to 0. I can test for 0 and throw the error back to the client, but it would help if I could explain why it happened. At this point, I don't know. Any ideas? I'm a bit new to this style of programming. Here's a (very simplified) example of the code. The user MUST have selected a year in order to ever have reached the save function.

Here is my C# server code:

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;
        }
    }
}

Here is my JavaScript client code:

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:


Your problem is this:

 private static int SelectedYear;

You'll want to remove the static. Static means it's global and will be shared for all users/requests... so when you set it to 2013 for one user, and another user hits that page who hasn't yet selected a year, it will be set to 0... for both of them. Yikes!

Trace through your postbacks to see what is happening to that variable during your AJAX methods.

You should consider storing the value in a session variable or maybe in a hidden field on the page.

More reading on a similar post: ASP.NET C# Static Variables are global?



来源:https://stackoverflow.com/questions/13497680/ajax-pagemethod-accessing-page-level-private-static-property

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!