0

私はテーブルを作成するよりもリピーターを持っています:

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

注:OnClientClick="todo"行。

最終的にレンダリングされたコードでは、todoにjavascript関数の呼び出しを含めて、次のように渡します。

  • 生成されたテーブル行のID、および
  • 現在バインドされているオブジェクトのプロパティの評価

そして今、いくつかの擬似コードのために:

擬似コード1:

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

擬似コード2

OnClientClick = "javascript:DoSomething(theTableRow、CromulentGuid);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")%>); 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(&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>

注: 2番目の形式は機能的に同一であることがわかっているので問題ありません。また、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 未満のブラウザーは実際には期待どおりに動作しませんが、それは最近のコースとほぼ同等です。

他の 2 つの可能性は、Datagrid/Gridview オブジェクトと OnItemDatabound の側面を利用するか、ASP.NET TABLE コントロールを利用してコードでテーブルを構築し、データソースを手動で反復処理することです。

于 2009-01-26T15:56:39.723 に答える