Session [“<delegate>”]导致一些变量内容丢失</delegate>

时间:2015-02-25 08:29:53

标签: asp.net session

我在ASP.NET站点中使用委托。 我使用Session [“”]来保存这个委托的值。 在调用它时,它在调用的方法体内调用正确的方法BUT,所有变量都具有来自先前状态的值。 当我直接调用该方法(不使用委托)时,没有问题。

我编写并测试了这个虚拟代码,以更全面的方式说明问题:

namespace WebApplication_test_update_controls
{
    public partial class _Default : System.Web.UI.Page
    {
        public delegate void My_delegate();

        public string str;
        public int age;
        My_delegate del1;

        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack) //first load
            {
                str = "postback value";
                age = 1;
                del1 = LB_Add_Text;
                TextBox1.Text = "fennec postback";

                Session["str"] = str;
                Session["age"] = age;     
                Session["del1"] = del1;
            }

            if(IsPostBack)
            {
                del1 = (My_delegate)Session["del1"];
                str = (string) Session["str"];
                age = (int) Session["age"];

            }
        }

protected void Button5_Click(object sender, EventArgs e)
        {
            str = "Value Button event";
            age = 10;
            TextBox1.Text = "fennec Button event";



            //Call of the method without using the delegate, LB_Add_Text is executed with correct values
            LB_Add_Text();

           //!!!Call of the method using the delegate, LB_Add_Text is executed with INCORRECT values!!!
            del1();

             //I explicitally point del1 to LB_Add_Text again (although it seems to already point there looking at debugger
             del1 = LB_Add_Text;

            //then B_Add_Text is executed with correct values this time
            del1();


        }


        public void LB_Add_Text()
        {
            ListBox3.Items.Add(TextBox1.Text);
        }

 }
}

正如您在评论中看到的, 所有值都存储在第一个PageLoad之后的Session中,并在回发后检索(age,str和delegate del1)。

当我点击一个按钮时,我将新值设置为age和str。调试器显示del1仍然指向LB_Add_Text(在回发后显然正确地从Session [“del1”]检索。

我直接调用LB_Add_Text:一切正常,它使用了预期的值:

   str = "Value Button event";
   age = 10;
   TextBox1.Text = "fennec Button event";

然后我调用委托(应该这样做):它不使用期望的值。它正确调用LB_Add_Text,但使用从Session:

中检索的值
str = "postback value";
                age = 1;
                del1 = LB_Add_Text;
                TextBox1.Text = "fennec postback";

最后,我明确地将del1重新指向LB_Add_Text

del1 = LB_Add_Text;

,我再次调用它:然后一切按预期工作,并使用预期的变量值调用LB_Add_Text:

str = "Value Button event";
   age = 10;
   TextBox1.Text = "fennec Button event";

我觉得整个问题来自:

del1 = (My_delegate)Session["del1"];

以某种方式表现不像我期望的那样,并且不仅存储/检索委托签名。

你能否让大师了解我错过的内容?

提前谢谢。

0 个答案:

没有答案