【问题标题】:What is the correct way to modify Page from an EventHandler in ASP.NET C#?从 ASP.NET C# 中的 EventHandler 修改 Page 的正确方法是什么?
【发布时间】: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


【解决方案1】:

您的事件正在触发,响应正在写入页面。先前的响应将不存在,因此看起来该事件尚未触发。

这是因为在使用网络表单时,整个页面会在响应中重新创建。所以你之前的回复不存在了。值得一读 Webforms 中的 ViewState,如果您想解决这个问题,您可以使用 AJAX 或添加到页面的客户端事件,而无需重绘整个 html 内容。

要解决这个问题,你可以实现一个计数或类似的东西......

protected void Page_Init(object sender, EventArgs e)
{
    try
    {
        if (ViewState["counter"] != null)
        {
            int counter = Convert.ToInt32(ViewState["counter"]);

            ViewState["counter"] = counter++;
        }        
        else
        {
            int count = 1;

            ViewState["counter"] = count;
        }   

        var myThing = new MyThing();
        myThing.EventHappens += EventHappensCompleted;
    }
    catch (Exception err)
    {
        Response.Write("ERROR");
    }
}

还有事件..

protected void EventHappensCompleted(object o, CustomEventArgs e)
{
    if (ViewState["counter"] != null)
    {
        var count = Convert.ToInt32(ViewState["counter"]);

        for (int i = 0; i < count; i++)
        {
            Response.Write("EventHappensCompleted");
        }
     }
}

【讨论】:

  • 我试过这个,但我仍然得到相同的行为。 MyThing 只是一个虚构的占位符类。
  • 你的实际代码是什么。因为我发布的内容每次都会触发。您是否将其包裹在 if(!Postback) 或其他东西中?
  • 你的代码是什么?我已经编辑了我的帖子以包含完整的 Test.aspx.cs。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-07
  • 2021-03-23
  • 2013-09-26
  • 2013-05-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多