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);
}
Использование этого примера в качестве концепции показывает, что у вас есть только один раздел кода для обработки нескольких параметров и, следовательно, только одно место для поддержки и т.д.