请解释以下代码?

时间:2010-11-19 14:11:41

标签: asp.net

在浏览一些代码时,我发现有这样的代码:

ListViewDataItem dataItem = (ListViewDataItem)(((ImageButton)sender).Parent.Parent);

int noteId = Convert.ToInt32(((HiddenField)dataItem.FindControl("hidNoteId")).Value);

请解释这两行的含义。

3 个答案:

答案 0 :(得分:4)

有一个控件(键入隐藏字段)用于跟踪ListView中项目的标识(http://msdn.microsoft.com/en-us/library/bb398790.aspx)

这是不应该写的代码,IMO。这是低效和脆弱的。此外,项目的标识以纯文本形式存储在页面源中。

此代码似乎在单击按钮时获取数据绑定项的标识。更好的方法是简单地设置按钮的命令参数,如下所示:

<asp:ImageButton runat="server" CommandArgument="[Binding Expression]" />

在按钮的事件处理程序中,可以检索CommandArgument并将其转换为Int32。使用这种方法,你甚至不需要那个隐藏的领域。

答案 1 :(得分:3)

首先,这两条线在使用括号和铸造时似乎有点疯狂。可能有更好的方法来做他们正在做的事情,但没有更多的代码,很难提供任何建议。

无论如何,第一行将在ImageButton引发的事件的事件处理程序中。事件处理程序方法将具有sender参数;这是投射到ImageButton。然后在此ImageButton上调用Parent.Parent;这将使对象在控制层次中达到两级。开发人员显然很确定这是一个ListViewDataItem,所以它被投射到其中一个。因此,变量dataItem现在包含ListViewDataItem的实例。

在第二行中,FindControl方法正在调用dataItem方法。可能在此ListViewDataItem下有一个ID为“hidNoteId”的控件。 FindControl返回Control;但开发人员知道这个控件实际上是HiddenField,所以有一个演员。然后将此隐藏字段的Value属性传递到Convert.ToInt32方法以提供整数 - 然后将其存储在noteId变量中。

所以在最后,有一个ListView,其中每个数据项都包含一个包含某个ID值的隐藏字段。此代码正在获取ID。

答案 2 :(得分:1)

  1. dataItem是一个绑定控件,在单击时用于表示占位符。这用于标识控件中正在执行的行。
  2. 通过查找此控件的父级父级,它为代码提供了一个起点,以导航到正确的行以从中提取值。
  3. 找到行后,将​​为noteId分配一个隐藏值并转换为整数。
  4. 当项目绑定到网格/转发器时,如果使用按钮作为后置控制,则需要一种方法来识别正在执行的行。上面所做的所有代码都是导航控件并从行中的一组值中提取值。