Передача нескольких аргументов через CommandArgument кнопки в ASP.NET
-
24-09-2019 - |
Вопрос
У меня есть GridView с несколькими строками, у каждого есть кнопка обновления, и мне нужно пройти 2 значения, когда кто-то нажимает на кнопку обновления. Помимо упаковки аргументов внутри благосостояния, разделенного запятыми (архаичными и не элегантными), как бы я передал более одного аргумента?
<asp:LinkButton ID="UpdateButton" runat="server" CommandName="UpdateRow" CommandArgument="arg_value" Text="Update and Insert" OnCommand="CommandButton_Click" ></asp:LinkButton>
В качестве примечания значения не могут быть получены из любых элементов управления на странице, поэтому в настоящее время я не ищу никаких дизайнерских решений.
Решение
После того, как тыкать вокруг, похоже, Келси правильно.
Просто используйте запятую или что-то и разделить его, когда вы хотите потреблять его.
Другие советы
Вы можете пройти полуконные значения запятой в качестве аргумента команд, а затем разделить строку и использовать ее.
<asp:TemplateField ShowHeader="false">
<ItemTemplate>
<asp:LinkButton ID="lnkCustomize" Text="Customize" CommandName="Customize" CommandArgument='<%#Eval("IdTemplate") + ";" +Eval("EntityId")%>' runat="server">
</asp:LinkButton>
</ItemTemplate>
</asp:TemplateField>
на стороне сервера
protected void gridview_RowCommand(object sender, GridViewCommandEventArgs e)
{
string[] arg = new string[2];
arg = e.CommandArgument.ToString().Split(';');
Session["IdTemplate"] = arg[0];
Session["IdEntity"] = arg[1];
Response.Redirect("Samplepage.aspx");
}
Надеюсь, поможет!!!!
@ Ответ Патрика - хорошая идея и заслуживает больше кредита!. Вы можете иметь столько элементов данных, сколько вы хотите, они все разделены и могут быть использованы на стороне клиента при необходимости.
Они также могут быть дополнено, а не в коде. Я только что сделал это для Gretview, как это:
<asp:TemplateField HeaderText="Remind">
<ItemTemplate>
<asp:ImageButton ID="btnEmail"
data-rider-name="<%# ((Result)((GridViewRow) Container).DataItem).Rider %>"
data-rider-email="<%# ((Result)((GridViewRow) Container).DataItem).RiderEmail %>"
CommandName="Email" runat="server" ImageAlign="AbsMiddle" ImageUrl="~/images/email.gif" />
</ItemTemplate>
</asp:TemplateField>
В RowCommand вы делаете это:
void gvMyView_RowCommand(object sender, GridViewCommandEventArgs e)
{
if (e.CommandName == "Email")
{
var btnSender = (ImageButton)e.CommandSource;
var riderName = btnSender.Attributes["data-rider-name"];
var riderEmail = btnSender.Attributes["data-rider-email"];
// Do something here
}
}
Настолько более чище, чем взлом всех ценностей вместе с разделителями и распаковки снова в конце.
Не забудьте тестировать / чистить любые данные, с которых вы вернетесь со страницы, если она подделана!
Мой подход использует коллекцию атрибутов, чтобы добавить данные HTML-атрибуты из кода позади. Это более встроен с JQuery и клиентской стороной сценариев.
// This would likely be done with findControl in your grid OnItemCreated handler
LinkButton targetBtn = new LinkButton();
// Add attributes
targetBtn.Attributes.Add("data-{your data name here}", value.ToString() );
targetBtn.Attributes.Add("data-{your data name 2 here}", value2.ToString() );
Затем извлеките значения через коллекцию атрибута
string val = targetBtn.Attributes["data-{your data name here}"].ToString();
Немного более элегантный способ сделать то же самое добавление к вышеуказанному комментарию ..
<asp:GridView ID="grdParent" runat="server" BackColor="White" BorderColor="#DEDFDE"
AutoGenerateColumns="false"
OnRowDeleting="deleteRow"
GridLines="Vertical">
<asp:BoundField DataField="IdTemplate" HeaderText="IdTemplate" />
<asp:BoundField DataField="EntityId" HeaderText="EntityId" />
<asp:TemplateField ShowHeader="false">
<ItemTemplate>
<asp:LinkButton ID="lnkCustomize" Text="Delete" CommandName="Delete" CommandArgument='<%#Eval("IdTemplate") + ";" +Eval("EntityId")%>' runat="server">
</asp:LinkButton>
</ItemTemplate>
</asp:TemplateField>
</asp:GridView>
И на стороне сервера:
protected void deleteRow(object sender, GridViewDeleteEventArgs e)
{
string IdTemplate= e.Values["IdTemplate"].ToString();
string EntityId = e.Values["EntityId"].ToString();
// Do stuff..
}
Либо храните его в коллекции GridView Datakeys или храните его в скрытом поле внутри одной и той же ячейки, или соедините значения вместе. Это единственный путь. Вы не можете хранить два значения в одной ссылке.
Если вы хотите пройти два значения, вы можете использовать этот подход
<asp:LinkButton ID="RemoveFroRole" Text="Remove From Role" runat="server"
CommandName='<%# Eval("UserName") %>' CommandArgument='<%# Eval("RoleName") %>'
OnClick="RemoveFromRole_Click" />
В основном я отношусь к {Commmandname, CommandArgument} в качестве ключевого значения. Установить как из поля базы данных. Вам придется использовать событие onclick и использовать OnCommand
Событие в этом случае, которое я думаю, более чистый код.