【问题标题】:Ajax PageMethod accessing page-level private static propertyAjax PageMethod 访问页面级私有静态属性
【发布时间】:2012-11-21 16:28:23
【问题描述】:

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

【问题讨论】:

    标签: asp.net ajax webmethod


    【解决方案1】:

    你的问题是这样的:

     private static int SelectedYear;
    

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

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

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

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

    【讨论】:

    • 我想我将按照您的建议将年份作为加密值存储在客户端的隐藏字段中。会话可能会导致问题,因为在生产中,此应用程序在具有三个节点的负载均衡器上运行(使用粘性位,因此用户不会经常被传递),而且我只有进程内会话可供我使用.但是,这揭示了这样一个事实,即无论是在会话中还是在其他地方,将所选年份存储在服务器上都会产生相同的影响。谢谢你的解释。我现在有点明白了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-26
    • 2018-04-18
    • 2010-11-27
    • 2011-03-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多