设置在事件处理程序之间使用的类级变量

时间:2010-03-17 16:42:25

标签: c# asp.net

我很难理解为什么以下代码不起作用。我确信这是一种补救措施,我缺少或不理解。我目前有一个页面要求用户输入。如果基于输入和登录用户,我在数据库中找到了此页面中的数据,我需要更新现有记录而不是创建新记录,因此我将类级别bool设置为true。问题是,当单击MyNextButton时,PreviouslySubmitted仍为false。所以,我不确定如何使这个变量的值持续存在。感谢任何建议,谢谢。

public partial class MyForm : System.Web.UI.Page
{
    private bool PreviouslySubmitted;

    protected void Page_Load(object sender, EventArgs e)
    {
        MyButton.Click +=
            (o, i) =>
            {
                q = from a in db.TableA
                    where (a.SomeField == SomeValue)
                    select a;

                if(q.Any())
                {
                    PreviouslySubmitted = true;
                    //populate the form's fields with values from database for user to revise
                }
            }

        MyNextButton.Click +=
            (o, i) =>
            {
                //the value of PreviouslySubmitted is false at this point, 
                //even if I made sure it was set to true the previous postback

                if(PreviouslySubmitted)
                {
                    //update database
                }
                else
                {
                    //insert into database
            }
    }

2 个答案:

答案 0 :(得分:1)

将previousSubmitted变量声明为静态。

重要更新
对不起,我没有检查“基于输入和登录用户”部分问题。

为什么它的工作很简单:请求和页面回发之间没有共享状态 - 缺少HTTP协议。

因此,正在使用ViewState机制在每个请求上重建页面控件的状态,但是您自己的对象,字段和变量不是。每个页面请求(访问者)都有自己的MyForm类实例,但静态变量对所有这些实例都是通用的。因此,删除static关键字并使用ViewState / SessionState存储每个用户的PreviouslySubmitted变量的值。

答案 1 :(得分:0)

您的代码正在创建两个事件处理程序。你确定按照你期望的顺序打电话给他们吗?如果第一个被称为第一个,你会遇到这个问题。您可能应该将两个事件处理程序的代码合并为一个。