2011-02-11 6 views
1

Можно ли передать несколько аргументов внутри параметра CommandArgument обработчику ItemCommand для репитера ASP.NET?DataRepeater OnCommand multiple CommandArgument

У меня есть таблица, которую я визуализирую с несколькими столбцами, довольно простой, мне просто нужен один linkbutton, при нажатии на него мне нужно передать 3 параметра функции onclick, все три являются параметрами, связанными с данными. Кажется, что нет способа сделать это, кроме использования CSV-формата (который не будет работать для меня, поскольку сами значения могут содержать запятые).

Итак, можно ли передать p_field1, p_field2 и p_field3 в соответствии с приведенным ниже кодом. Спасибо!

<asp:Repeater ID="rptId" runat="server" EnableViewState="true" OnItemCommand="rptId_ItemCommand"> 
           <ItemTemplate> 
           <tr align="center" class='<asp:Literal ID="litRowClass" runat="server" />'> 
            <td><%#Eval("p_field1")%></td> 
            <td><%# Eval("p_field2")%></td> 
            <td><%# Eval("p_field3")%></td> 
            <td><%# Eval("p_field4")%></td> 

            <td><asp:LinkButton runat="server" ID="lnkBtnId" CommandArgument='<%# Eval("p_field1") %>' CommandName="testCommandName">MARK</asp:LinkButton></td>     




           </tr> 
           </ItemTemplate> 
          </asp:Repeater> 
+0

CSV не обязательно должен быть список разделенных запятыми значений, но вы можете использовать то, что вы хотите в качестве разделителя. Вы можете легко разделить эти значения на сервере. –

+0

Это то, что переменная может содержать текст, любой текст. Поэтому я хотел бы сделать это правильно, а не наоборот. Кажется, что данные, привязанные к серверу, должны быть доступны для datarepeater? похоже, что это не так. aghghg – sarsnake

ответ

2

К сожалению, вы не можете пройти в нескольких полях без формата «CSV»; допускается только одна строка.

Вам нужно будет выполнить некоторую конкатенацию строк, а затем разделить его на OnCommand. Выберите некоторый разделитель, который не будет в ваших параметрах, ниже я использовал |.

<asp:Repeater ID="rptId" runat="server" EnableViewState="true" OnItemCommand="rptId_ItemCommand"> 
    <ItemTemplate> 
     <tr align="center" class='<asp:Literal ID="litRowClass" runat="server" />'> 
      <td><%#Eval("p_field1")%></td> 
      <td><%# Eval("p_field2")%></td> 
      <td><%# Eval("p_field3")%></td> 
      <td><%# Eval("p_field4")%></td> 
      <td><asp:LinkButton runat="server" ID="lnkBtnId" CommandArgument='<%# Eval("p_field1") + "|" + Eval("p_field2") + "|" + Eval("p_field3") %>' CommandName="testCommandName">MARK</asp:LinkButton></td>     
     </tr> 
    </ItemTemplate> 
</asp:Repeater> 

Вы бы тогда нужно что-то вроде следующего в rptId_ItemCommand:

string[] arguments = CommandEventArgs.CommandArgument.Split('|'); 
+0

hmmmmm, так что в основном значения привязанных данных не доступны на стороне сервера вообще? Я имею в виду, они уже связаны ... Я в восторге от идиотизма MS (если это так) – sarsnake

+0

Я пометил его как ответ, но я переключил свой код на использование GridView – sarsnake

+0

Уловка в том, что ретранслятор не может быть привязаны к тем же данным о обратной передаче; MS абстрагируется от связанного объекта также, чтобы избежать сериализации всех этих данных как viewstate и т. Д. В WPF и других более новых технологиях у них есть другие механизмы, которые могут иметь несколько аргументов для команд. Я также не понимаю, почему GridView помогает. –

1
CommandArgument='<%# JoinFields(Eval("p_field1"), Eval("p_field2"), Eval("p_field3")) %>' 

Вы можете использовать то, что вы хотите в качестве разделителя (f.e трубы |.). Вы можете легко разделить эти значения на сервере. Для того, чтобы присоединиться к этим полем можно использовать помощника-функцию, как это: (. F.e трубы |)

Protected Function JoinFields(ByVal p_field1 As Object, ByVal p_field2 As Object, ByVal p_field3 As Object) As String 
    Return String.Join("|", New Object() {p_field1, p_field2, p_field3}) 
End Function 
+0

Тим, сам текст может содержать любые значения, включая |,^или #, поэтому я не могу использовать эти методы, хотя они кажутся грязным легким обходным путем. Похоже, мне нужно переключиться на GridView – sarsnake

+0

Хорошо, но мне интересно, почему у вас есть уникальный идентификатор в GridView, пока у вас его нет в репитере. –

+0

Какой уникальный идентификатор вы имеете в виду? – sarsnake

Смежные вопросы