Передать объект как CommandArguement в кнопке ссылки повторителя

У меня есть повторитель со списком клиентов. Напротив каждого клиента есть кнопка удаления ссылки. Как часть кнопки ссылки я хочу передать объект Customer аргументу команды следующим образом (где Container.DataItem — это объект клиента):

<asp:LinkButton  ID="lnkDelete" 
   OnClientClick="return confirmDelete();"  
   OnClick="Customer_OnDelete"  
   CommandArgument="<%# Container.DataItem  %>"  
   CommandName="Delete" 
   runat="server"></asp:LinkButton>

Когда я делаю это:

    var button = (((LinkButton) sender));

    var customer=  button.CommandArgument;

button.CommandArguement — это строка. Мне нужны все свойства объекта, так как мы используем Nhibernate, поэтому все нужно установить, идентификатора удаленной записи недостаточно. Я видел в Интернете примеры передачи списка значений, разделенных запятыми, в аргумент команды, но не хочу этого делать. Это возможно?

Есть идеи? Спасибо


person MikeL    schedule 19.09.2012    source источник
comment
Разве вы не можете просто использовать эту строку (которая, как я полагаю, является идентификатором?) И использовать ее для запроса вашей базы данных, чтобы получить все необходимые элементы? что-то вроде getCustomerById(int id)?   -  person Thousand    schedule 19.09.2012
comment
@JaneDoe - Верно. Это то, что обычно делается в этих сценариях. Тем более, что с ORM контекст в любом случае не будет рядом, чтобы вы могли нажать «Сохранить».   -  person Josh    schedule 19.09.2012


Ответы (2)


На мой взгляд, лучший способ для этого случая:

  • Получите идентификатор от CommandArgument
  • Получить клиента по ID
  • Удалить сущность клиента

Используйте событие Repeater OnItemCommand. Это событие содержит RepeaterCommandEventArgs. Вы не можете получить CommandArgument таким образом:

protected void myRepeater_ItemCommand(object source, RepeaterCommandEventArgs e)
{
   int customerID= Convert.ToInt32(e.CommandArgument.ToString());
}

В вашем теге asp:LinkButton используйте:

CommandArgument='<%# DataBinder.Eval(Container.DataItem, "ID") %>'
person Fonseca    schedule 19.09.2012
comment
Похоже, мне придется это сделать, передав клиента и используя его для моего удаления. - person MikeL; 19.09.2012
comment
int customerID= Convert.ToInt32(e.CommandArgument.ToString()); это серьезное ограничение в коде... вы всегда должны использовать try.parse - person Shakawkaw; 17.12.2015

Проблема, с которой вы сталкиваетесь здесь, заключается в том, что ваш повторитель должен быть переведен в HTML. Поэтому вы ограничены пределами того, что разрешено спецификацией в атрибуте элемента.

На стороне сервера CommandArgument всегда будет строкой, поэтому вы не можете делать то, что хотите, поскольку вы это закодировали.

Теперь... есть несколько хаков, которые вы можете использовать, чтобы обойти это, например, вышеупомянутый CSV, или вы можете использовать бинарная сериализация и Base64 кодирует результат. Однако все это ужасные решения!

Что вам нужно, так это переосмыслить, как вы это делаете. Я обещаю, что есть более простой способ.

person Josh    schedule 19.09.2012