【问题标题】:How Does ASP.NET Knows Which Button Caused a PostBack?ASP.NET 如何知道哪个按钮导致了回发?
【发布时间】:2011-12-27 12:27:00
【问题描述】:

我正在使用 ASP.NET 4 创建一个页面,其中包含在 jQuery UI Sortable plugin 中使用的元素。

所有这些元素都包含一个名称为SubmitButton 的按钮(实现为提交按钮)。除了其中一个按钮之外,所有按钮都隐藏在页面的 Load 事件中。但是,如果我将元素拖到另一个位置,然后使用该按钮提交页面,ASP.NET 就会感到困惑。

ASP.NET 认为我单击了一个不同的按钮,该按钮甚至在页面上都不可见,但与移动前单击的按钮所在位置的内容相关联。 (如果我不移动元素,它可以正常工作。)

我似乎无法确定这是如何发生的。据我了解,ASP.NET 知道哪个提交按钮导致了回发,因为该按钮的名称和值包含在回发数据中。 (__EVENTTARGET 在这里没有任何作用,是空的。)那么它怎么会认为一个不同的按钮提交了页面呢?

ASP.NET 怎么会对提交页面的按钮感到困惑?

(抱歉,无法将此页面放在公共网站上。)

【问题讨论】:

  • 我假设您通过某种 javascript 拖动按钮。拖动按钮后,控件的名称和 id 是否与呈现时保持一致?
  • jQuery UI Sortable 插件负责重新定位元素。它移动元素,而不是重命名它们。

标签: asp.net


【解决方案1】:

我解决了这个问题,这就是我发现的。

首先,按钮默认呈现为<input> 标签,type = submit。这种情况下的回发机制与 ASP.NET 无关。回发数据包括导致回发的提交按钮的名称以及按钮的文本(格式为 name=text)。

但默认情况下,ASP.NET 按钮名称包括所有父控件的名称。当这些控件未命名时,它们会被赋予一个 ID,如 ctl00、ctl01、ctl02 等。结果是我的所有按钮都保证有一个唯一的名称。

问题是这些按钮和父控件都是动态创建的。在回发时,这些控件在加载事件中重建但以新的顺序。因为顺序会影响名称(ctl01 与 ctl02),这意味着我的提交按钮的名称与最初呈现页面时的名称不同。

结果是 ASP.NET 看到与用于触发回发的提交按钮关联的错误名称。

【讨论】:

  • 只是另一个切换到 MVC 的理由 :)
  • 我不反对。我们正在这样做。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-05-01
  • 2022-08-18
  • 1970-01-01
  • 1970-01-01
  • 2011-04-11
  • 2021-10-08
相关资源
最近更新 更多