我有一个转发器而不是创建一个表:
<itemtemplate>
<tr id="theTableRow" runat="server">
<td>
<asp:LinkButton runat="server"
OnClientClick="todo"
Text="Do Something" />
</td>
</tr>
</itemtemplate>
注意: OnClientClick="todo"
行。
在最终渲染的代码中,我希望 todo 包含对javascript函数的调用,传递:
现在有些伪代码:
伪代码1:
OnClientClick =“DoSomething(theTableRow,CromulentGuid); return false;”
伪代码2
OnClientClick =“javascript:DoSomething(theTableRow,CromulentGuid); return false;”
伪代码3
OnClientClick =“javascript:DoSomething(theTableRow,&lt;%#Eval(”CromulentGuid“)%&gt;);返回false;”
伪代码4
OnClientClick =“javascript:DoSomething(&lt;%= theTableRow%&gt;,&lt;%#Eval(”CromulentGuid“)%&gt;);返回false;”
伪代码5
OnClientClick ='javascript:DoSomething(&lt;%= Eval(theTableRow)%&gt;,&lt;%#Eval(“CromulentGuid”)%&gt;);返回false;'
无论使用什么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("ctl00__itemRepeater_ctl01_theTableRow", "19a149db-5675-4eee-835d-3d78372ca6f9"); return false;'
href="javascript:__doPostBack('ctl00$itemRepeater$ctl01$ctl04','')">
Do Something
</a>
</td>
</tr>
注意:我对第二种形式没问题,因为我知道它在功能上是相同的,并且ASP.NET代码无法生成前者,即使后者的可读性较差。
相关问题:
ASP.NET: How to access repeater generated elements from javascript?
答案 0 :(得分:1)
更好的解决方案是put the presentation logic in the business layer:
<强>演示:强>
<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;
}
更清洁。更具可读性。更加可维护。
答案 1 :(得分: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()语法,但它应该有所帮助。
答案 2 :(得分:0)
为什么不将JS放在表格行上?
<tr onClick="DoSomething(this, '<%# Eval("GUIDColumn") %>')"; ><td>
<%# Eval("ColumnText") %>
</td></tr>
这将引导您对表行以及您需要的数据的引用。它确实打破了低级别的支持,因此IE6下的浏览器不会像预期的那样真正起作用,但是这些日子里的浏览器非常相似。
另外两种可能性是利用Datagrid / Gridview对象和OnItemDatabound方面,或者使用ASP.NET TABLE控件在代码中构建表,并手动迭代数据源。