LinkButton CommandName и CommandArgument

У меня возникли проблемы с пониманием CommandName и CommandArgument, связанных с ASP.NET LinkButton. Я прочитал эту статью - http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.button.commandname.aspx и другие вопросы на этом сайте.

Я думаю, мои вопросы - что такое "команда"? Может ли CommandName быть любым текстом? В качестве примеров я вижу "Сортировка" и "Отправить". А что касается CommandArgument, это просто используется для дальнейшего указания типа "Команда". Верный? Большое спасибо за вашу помощь.

Ответы

Ответ 1

A Command может быть любым, что вы хотите.

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

Затем на обратной стороне вы можете проверить, какой из CommandName был запущен, и на основе того, что использует значение в CommandArgument

Например, надпись может выглядеть примерно так:

<asp:Repeater runat="server" id="myRepeater">
  <ItemTemplate>
    <div>
      <asp:LinkButton runat="server" id="lnkEdit" CommandName="edit" 
        CommandArgument="<%#Container.DataItem.Id%>" Text="Edit" 
        OnClick="OnClickHandler" />
      <asp:LinkButton runat="server" id="lnkDelete" CommandName="delete" 
        CommandArgument="<%#Container.DataItem.Id%>" Text="Delete"
        OnClick="OnClickHandler" />
    </div>
  </ItemTemplate>
</asp:Repeater>

Затем ваш обработчик post-pack может проверить, какой из них был нажат...

Protected Sub OnClickHandler(ByVal sender As Object, ByVal e As EventArgs)
  Dim lnk as LinkButton = CType(sender,LinkButton)
  Select Case lnk.CommandName
    Case "edit"
      EditItem(lnk.CommandArgument)
    Case "delete"
      DeleteItem(lnk.CommandArgument)
  End Select
End Sub

Ответ 2

CommandName может быть любая строка да. Но будьте осторожны! ASP.NET будет обрабатывать определенные строки особым образом. Например, если у вас есть элемент управления Button в столбце GridView с CommandName для "delete", он поднимет событие OnDeleting и CommandArgument будет установлен в индекс строки GridViewRow, в котором находится кнопка. В противном случае, как и другие, вы можете использовать CommandName и CommandArgument, но лучше всего подходит для ваших обстоятельств.

обычно вы устанавливаете CommandArgument как индекс строки управляющего родительского контейнера во время привязки, а CommandName будет чем-то значимым для вашего домена приложения, например, "UpdateFoo". Затем вы используете это в обработчике событий OnRowCommand, чтобы определить, какая кнопка была нажата, и, следовательно, какую бизнес-логику выполнить.

Ответ 3

CommandName - это то, что вы на самом деле делаете, когда событие запускается, и CommandArgument и, конечно же, является аргументом, связанным с процессом. Это имеет смысл, если вы используете кнопки ссылок в репитере или аналогичные элементы списка. В этом случае ваш CommandName может быть "Удалить", "Изменить", "Опубликовать" и для этого процесса вам нужно знать, с какой записью вы имеете дело, и "CommandArgument" - ваш человек, в этом случае вы можете назначить ему идентификатор или разделенные запятыми данные для обработки.

Конечно, вы также можете использовать это для слияния подобных событий. "Сортировка" - отличный пример для этого, поскольку вы можете дать "CommandArgument" как "Price asc", "Date asc", "Date desc" все триггеры ваших ссылок событие.

Ответ 4

Как говорит freefaller, оба CommandName и CommandArgument являются просто строковыми значениями.

Причина, по которой много раз, но событие щелчка просто запускает щелчок кнопки, и вы обрабатываете эту кнопку (-ы).

Хорошим примером использования CommandButtons является представление, что у вас есть строки данных, каждая строка имеет возможность просмотра, редактирования или удаления.

Вместо кода для каждого отдельно, вы можете использовать части Command и иметь в каждой строке CommandArgument идентификатора записи, а CommandArgument - действие, которое вы хотите выполнить; ViewRec, EditRec and DelRec` например:

protect void cmd_Command(object sender, CommandEventArgs e)
{
    // Example, Redirect to page with action
    response.redirect(string.format("~/record.aspx?id={0}&action={1}", e.commandArgument, e.CommandName);
}

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