【问题标题】:How does ASP.NET know which Button was clicked in order to raise its eventASP.NET 如何知道单击了哪个 Button 以引发其事件
【发布时间】:2012-05-17 13:59:10
【问题描述】:

当使用LinkButton 时,doPostBack() 函数会在页面中呈现,当单击按钮时,doPostBack() 会在客户端调用,将表单提交到服务器,并在两个名为 @987654325 的隐藏字段中发送信息@ 和 EVENTARGUMENTEVENTTARGET 包含导致回发的控件名称,EVENTARGUMENT 包含任何信息。

使用此 ASP.NET 引擎从导致回发的 EVENTTARGET 参数获取控件名称并调用 RaisePostBackEvent() 事件来调用正确的服务器端事件处理程序。我了解doPostBack() 的工作原理以及服务器端事件处理程序的调用方式。

但是对于普通的服务器按钮,如何调用服务器端正确的按钮单击? ASP.NET 如何通知客户端点击的控件名称?

【问题讨论】:

    标签: asp.net webforms


    【解决方案1】:

    普通的 ASP.NET Button 被呈现为具有唯一 name 属性的 HTML <input type="submit"> 元素。默认情况下,此 HTML 元素将触发与当前 ASPX 页面关联的 HTTP POST to the HTML form

    当 HTTP POST 发生时,一系列控件名称/当前值对,称为表单数据集,由表单内部的 successful controls 构造而成,例如,文本框中的文本值是这样传输的.带有触发提交的按钮名称的一对也被发送到服务器,这就是 ASP.NET 知道哪个按钮触发了 HTTP POST。

    HTML 规范保证对于发布的表单数据集只考虑表单内的成功控件,因为成功控件的定义包含以下规则:

    如果一个表单包含多个提交按钮,只有激活的 提交按钮成功。

    然后 ASP.NET 可以检查发布的表单数据集以检查是否触发了任何正常按钮。

    【讨论】:

      【解决方案2】:

      一般来说,您不必担心按钮点击的内部结构。这就是 .Net 的美妙之处。

      但是,要具体了解客户端调用的内容,您可以简单地查看页面的源代码并查看按钮调用的内容。

      例子:

      <input name="ctl00$MainContent$btnMyButton" id="ctl00_MainContent_btnMyButton" onclick="javascript:WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions("ctl00$MainContent$btnMyButton", "", true, "", "", false, false))" type="submit" value="My Button"/>
      

      观察 .Net 注入了以下 javascript 例程:

      WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions("ctl00$MainContent$btnMyButton", "", true, "", "", false, false))
      

      【讨论】:

      • 嗨,杰里米,你对我的问题有何看法,我不知道。请看看我用渲染 html 更新我的问题。我用VS2010测试东西。我的渲染 html 没有称为 WebForm_DoPostBackWithOptions() 的方法签名。我知道当我们使用服务器端超链接标签等时,doPostBack() 在页面中呈现。如果我的页面中没有任何 WebForm_DoPostBackWithOptions() 或 doPostBack(),那么当我单击提交按钮时服务器端事件处理程序如何调用。我只需要知道 asp.net 如何跟踪哪个提交按钮导致回发并相应地调用正确的事件处理程序。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-02
      • 1970-01-01
      相关资源
      最近更新 更多