0

我有一个中继器而不是创建一个表:

<itemtemplate>
   <tr id="theTableRow" runat="server">
      <td>
         <asp:LinkButton runat="server"
            OnClientClick="todo"
            Text="Do Something" />
      </td>
   </tr>
</itemtemplate>

注:OnClientClick="todo"

在最终呈现的代码中,我希望待办事项包含对 javascript 函数的调用,传递:

  • 生成的表格行的 ID,以及
  • 当前绑定对象的属性的 Eval

现在对于一些伪代码

伪代码1:

OnClientClick="DoSomething(theTableRow, CromulentGuid); return false;"

伪代码 2

OnClientClick="javascript:DoSomething(theTableRow, CromulentGuid); return false;"

伪代码 3

OnClientClick="javascript:DoSomething(theTableRow, <%# Eval("CromulentGuid") %>); return false;"

伪代码 4

OnClientClick="javascript:DoSomething(<%= theTableRow %>, <%# Eval("CromulentGuid") %>); return false;"

伪代码 5

OnClientClick='javascript:DoSomething(<%= Eval(theTableRow) %>, <%# Eval("CromulentGuid") %>); 返回错误;'

无论使用什么 ASP.NET 代码,我都希望呈现的 HTML 是:

<tr id="ctl00__itemRepeater_ctl01_theTableRow">
   <td>
      <a 
            onclick="DoSomething('ctl00__itemRepeater_ctl01_theTableRow', '19a149db-5675-4eee-835d-3d78372ca6f9'); return false;"
            href="javascript:__doPostBack('ctl00$itemRepeater$ctl01$ctl04','')">
         Do Something
      </a>
   </td>
</tr>

我也可以:

<tr id="ctl00__itemRepeater_ctl01_theTableRow">
   <td>
      <a 
            onclick='DoSomething(&quot;ctl00__itemRepeater_ctl01_theTableRow&quot;, &quot;19a149db-5675-4eee-835d-3d78372ca6f9&quot;); return false;'
            href="javascript:__doPostBack('ctl00$itemRepeater$ctl01$ctl04','')">
         Do Something
      </a>
   </td>
</tr>

注意:我可以接受第二种形式,因为我知道它在功能上是相同的,并且 ASP.NET 代码无法生成前者,即使后者可读性较差。


相关问题:

ASP.NET:如何从 javascript 访问转发器生成的元素?

4

3 回答 3

1

更好的解决方案是将表示逻辑放在业务层

介绍:

<asp:LinkButton runat="server"
     OnClientClick="<%# GetItemClientClick((MySomething)Container.DataItem) %>"
     Text="Do stuff" />

商业逻辑

protected string GetItemClientClick(MySomething item)
{
   ...   
   String szOnClientClick = 
      "return DeleteItem(this, "+
          Toolkit.QuotedStr(item.NodeGUID.ToString()) + ", "+
          Toolkit.QuotedStr(GetItemText(item))+");";

   return szOnClientClick;
}

干净多了。更具可读性。更易于维护。

于 2009-01-26T21:06:33.277 回答
0

您可以使用该OnItemDataBound事件来更改代码中的每个元素。由于您特别关注 HTML,我可能还建议使用混合控件而不是 asp 控件。例如:

<itemtemplate>
   <tr id="theTableRow" runat="server">
      <td>
         <a runat="server"
            onclick="todo(this.parent.parent, '<%# Eval("Property") %>');return false;" >
            Do Something
         </a>
      </td>
   </tr>
</itemtemplate>

这可能不是 100% 完美,因为我只是直接在回复窗口中输入了它,而且我总是在第一次尝试时搞砸了 Eval() 语法,但它应该会有所帮助。

于 2009-01-26T15:54:54.280 回答
0

为什么不把JS放在表格行上呢?

<tr onClick="DoSomething(this, '<%# Eval("GUIDColumn") %>')"; ><td>
<%# Eval("ColumnText") %>
</td></tr>

这使您可以参考表格行以及您需要的数据。它确实破坏了下级支持,因此 IE6 下的浏览器不会像预期的那样真正工作,但这对于这些天的课程来说几乎是一样的。

另外两种可能性是利用 Datagrid/Gridview 对象和 OnItemDatabound 方面,或者利用 ASP.NET TABLE 控件在代码中构建表,并手动迭代您的数据源。

于 2009-01-26T15:56:39.723 回答