【发布时间】:2019-10-31 12:46:33
【问题描述】:
举个例子:
我有一个由 Test.aspx 和 Test.aspx.cs 组成的 Web 表单。
我的 Page_Load 函数将事件处理程序“EventHappensCompleted”绑定到对象“myThing”发生的事件以及对网页进行一些写入:
protected void Page_Load(object sender, EventArgs e)
{
Response.Write("Page_Load");
try
{
var myThing = new MyThing();
myThing.EventHappens += EventHappensCompleted;
}
catch (Exception err)
{
Response.Write("ERROR");
}
}
我的“EventHappensCompleted”函数如下所示:
protected void EventHappensCompleted(object o, CustomEventArgs e)
{
Response.Write("EventHappensCompleted");
}
当我第一次加载页面时,我会看到页面中写入了“Page_Load”。当第一个事件发生时,我会看到“EventHappensCompleted”写入页面,但之后的任何事件都不会写入页面。
我认为这种行为与后续事件处理程序位于不同线程上并且无法访问正确的上下文以写入页面有关,但我不确定。
如何修改此代码,以便事件处理程序每次都写入页面?
编辑 1:我应该明确指出,后续事件实际上正在发生。问题不在于这些事件实际上并没有发生。
编辑 2:这是完整的 Test.aspx.cs:
using System;
using System.Collections.Generic;
using System.Dynamic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
public partial class Test : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
Response.Write("Page_Load");
try
{
var myThing = new MyThing();
myThing.EventHappens += EventHappensCompleted;
}
catch (Exception err)
{
Response.Write("ERROR");
}
}
protected void EventHappensCompleted(object o, CustomEventArgs e)
{
Response.Write("EventHappensCompleted");
}
}
【问题讨论】:
-
我很困惑,你是说事件没有被写入页面。然后你说他们正在发生?期望的行为是什么?
-
正确。对于第一个事件之后的任何事件,“Response.Write”命令都不会输出到页面。事件本身正在发生并按预期触发 EventHandler(我可以通过使用“System.Diagnostics.Debug.WriteLine”输出到调试日志来确认这一点)。期望的行为是每次从 EventHandler 触发而不是仅第一次触发时向页面输出 Response.Write("EventHappensCompleted")。
-
所以随后的按钮按下仍然显示单行“EventsHappensCompleted”?因为这是应该发生的,所以你在响应中写了一行。先前的响应将被清除
-
肖恩,这就是问题所在。我期待 EventHandler 中的 Response.Write 像另一个一样将文本附加到页面上。相反,它正在替换第一次后输出的内容。你能解释一下为什么会这样吗?另外,如果您将此作为答案提交,我会将此帖子标记为已回答。
-
如果您是第一次学习 ASP.NET,don't start with Web Forms(我自己的博客条目)。有更好的框架供您学习,它们更易于使用,对您的职业生涯更有利,对您的最终用户也更好。
标签: c# asp.net webforms eventhandler