【问题标题】:Force an event handler to fire for a custom control on every postback强制事件处理程序在每次回发时触发自定义控件
【发布时间】:2011-02-14 13:06:23
【问题描述】:

我怀疑我的问题在于对自定义事件处理程序在 ASP.NET 中的工作方式缺乏了解。我读过几篇文章,但目标受众一直在尝试与我不同的东西。

我创建了一个在 Init 事件期间动态放置到我的页面上的 UserControl。它填充并且工作得很好,但是我对如何在回发期间从中检索数据感到头疼。

它实际上是一个完全使用客户端 JavaScript 操作的多选组合框(我大量使用 jQuery)。在控件容器元素中,我呈现了一个包含所有选定项的空 DIV 元素。当用户选择项目时,我会在包含一些标记的容器 DIV 中生成 DIV。在服务器端,我感兴趣的是几个 INPUT 字段的内容。

选择一个项目后,呈现的 HTML 如下所示:

<div class="multiPickContainer">
  <div class="multiPickItem">
    <input type="text" />
    <input type="hidden" />
  </div>
</div>

当然,问题在于这些选定的项目是在客户端生成的,而服务器对它们一无所知(例如,没有 runat="server" - 它是纯 HTML)。

在任何帖子[返回] 中,我希望在我的自定义控件中触发一个事件处理程序,使我能够检查此容器 DIV 中的元素。无论用户是否做出任何选择,我都希望触发此事件(控件可能已预先填充,在这种情况下,我仍然想知道其中有哪些选择)。

我所追求的是这样的:

private GenerateControl(TemplateControl page){
  var control = page.LoadControl("~/MyControl.ascx") as MyControl;
  control.OnPostBack += HandlePostback;
}

我可能完全偏离了轨道,这实际上可能是不可能的(或者是一个愚蠢的想法)。我能想到的唯一选择是发出实际的 ASP.NET 控件并挂钩内置事件处理程序。

任何人都可以提出任何建议,或者向我指出任何讨论创建自定义事件处理程序的优秀文献吗?

【问题讨论】:

    标签: asp.net


    【解决方案1】:

    如果您给 inputs 一个名称属性,则值将显示在 Request.Form

    【讨论】:

    • 谢谢,Yads,这非常有帮助并且运行良好。我还有一个问题是确保事件处理程序(我从 Request.Form 获取值)一直触发。我正在使用第三方控件,因此捕获了 TextChanged 和 SelectedIndexChanged 事件,但这很丑陋,因为某些用例会触发多个事件(而一个根本不会触发)。这与您的答案有些无关,但对我来说将事情联系在一起。我可以以某种方式强制事件处理程序在表单发布时始终被调用吗?
    • @Stefan,你能不能只调用Page_Load上的事件处理程序?
    • 很遗憾,没有,因为我的所有页面控件都是动态生成的(在 Init 事件中),因此手动调用事件处理程序将为控件的新实例执行此操作。但是,我可以通过在我的控件中添加一个带有 ValueChanged 事件处理程序的 HiddenField 来解决这个问题。 HiddenField 在交互过程中被客户端 JavaScript “触摸”,这可靠地触发了我的事件处理程序。感谢您的洞察力 - 现在一切正常!
    猜你喜欢
    • 2011-08-25
    • 2011-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多