我在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"];
以某种方式表现不像我期望的那样,并且不仅存储/检索委托签名。
你能否让大师了解我错过的内容?
提前谢谢。