Мне кажется, проблема в том, что «Страница» в вашем событии NextButton_Click
не совпадает со страницей, на которой вы установили заголовок «Привет».Поскольку вы передаете события в сеансе, когда событие вызывается, объект, на который он действует, больше не находится в области видимости.Вы можете воссоздать его с помощью следующего кода (который использует EventHandlers, но они в основном совпадают с тем, что вы обрисовали в своем коде)
protected void Page_Load(object sender, EventArgs e)
{
this.Page.Title = "test";
//Store it in your session...seems like a weird thing to do given how your page should be stateless, so I would think about what you are
//trying to do a bit more carefully. You don't want to call an event handler such as test below from another page in your asp.net app.
Dictionary<string, EventHandler> myEvents = null;
if (Session["Invokers"] == null)
{
myEvents = new Dictionary<string, EventHandler>();
Session["Invokers"] = myEvents;
}
else
{
myEvents = Session["Invokers"] as Dictionary<string, EventHandler>;
}
//If the event handler key is not in there then add it
if (myEvents.ContainsKey("buttonClickOnPageDefault") == false)
{
//Subscribe to event (i.e. add your method to the invokation list
this.TestEvent += new EventHandler(test);
myEvents.Add("buttonClickOnPageDefault", this.TestEvent);
}
else
{
//if it does contain this key then you may already be subscribed to event, so unsubscribe in case and then resubscribe...you could
//probably do this more elegantly by looking at the vales in the GetInvokationList method on the eventHandler
//Wire up the event
this.TestEvent -= new EventHandler(test);
this.TestEvent += new EventHandler(test);
}
//Resave the dictionary.
Session["Invokers"] = myEvents;
}
void test(object o, EventArgs e)
{
this.Page.Title = "testEvent";
}
public event EventHandler TestEvent;
protected void Button1_Click(object sender, EventArgs e)
{
if (Session["Invokers"] != null)
{
Dictionary<string, EventHandler> myEvents = (Dictionary<string, EventHandler>)Session["Invokers"];
if (myEvents.ContainsKey("buttonClickOnPageDefault"))
{
EventHandler ev = myEvents["buttonClickOnPageDefault"];
ev(null, EventArgs.Empty);
}
}
}
Если вы поместите вышеуказанный код на страницу asp.netон никогда не изменит заголовок страницы, но если вы установите точку останова в методе Test
, вы увидите, что она попадет.Причина в том, что он попадает на другую страницу (и эта страница выходит за рамки видимости и может не собирать мусор, поскольку ваше событие все еще имеет ссылку на него, так что это может вызвать утечку памяти ... будьте осторожны с этим!).На самом деле, вы, вероятно, не должны использовать свои события таким образом (по крайней мере, чтобы не действовать на странице ... возможно, у нее есть какая-то утилита для доменных объектов).Обратите внимание, что следующее будет работать (как его действие на той же странице)
protected void Page_Load(object sender, EventArgs e)
{
this.Page.Title = "test";
//Store it in your session...seems like a weird thing to do given how your page should be stateless, so I would think about what you are
//trying to do a bit more carefully. You don't want to call an event handler such as test below from another page in your asp.net app.
this.TestEvent += new EventHandler(test);
Session["Invoker"] = this.TestEvent;
}
void test(object o, EventArgs e)
{
this.Page.Title = "testEvent";
}
public event EventHandler TestEvent;
protected void Button1_Click(object sender, EventArgs e)
{
if (Session["Invoker"] != null)
{
EventHandler ev = (EventHandler)Session["Invoker"];
ev(null, EventArgs.Empty);
}
}
Надеюсь, что это даст вам несколько советов, где ваша проблема может быть.