Passando vários argumentos através do CommandArgument do Button no Asp.net
-
24-09-2019 - |
Pergunta
Eu tenho um gridview com várias linhas, cada uma tem um botão Atualizar e preciso passar 2 valores quando alguém clica no botão Atualizar.Além de empacotar os argumentos dentro de CommandArgument separados por vírgulas (arcaico e não elegante), como eu passaria mais de um argumento?
<asp:LinkButton ID="UpdateButton" runat="server" CommandName="UpdateRow" CommandArgument="arg_value" Text="Update and Insert" OnCommand="CommandButton_Click" ></asp:LinkButton>
Como observação, os valores não podem ser recuperados de nenhum controle na página, portanto, no momento, não estou procurando nenhuma solução de design.
Solução
Depois de cutucá -lo, parece que Kelsey está correto.
Basta usar uma vírgula ou algo assim e dividi -lo quando quiser consumi -lo.
Outras dicas
Você pode passar nos valores separados do Semicolon como argumento de comando e depois dividir a string e usá -lo.
<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>
no lado do servidor
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");
}
Espero que ajude!!!!
A resposta de @Patrick é uma boa ideia e merece mais crédito!Você pode ter quantos itens de dados desejar, todos separados e podem ser usados no lado do cliente, se necessário.
Eles também podem ser adicionados de forma declarativa, em vez de em código.Acabei de fazer isso para um GridView como este:
<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>
No RowCommand, você faz isso:
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
}
}
Muito mais limpo do que hackear todos os valores junto com delimitadores e descompactar novamente no final.
Não se esqueça de testar/limpar todos os dados que você receber da página, caso tenham sido adulterados!
Minha abordagem é usar a coleção Atributos para adicionar atributos de dados HTML do código atrás. Isso é mais alinhado com o JQuery e o script lateral do cliente.
// 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() );
Em seguida, recupere os valores através da coleção de atributos
string val = targetBtn.Attributes["data-{your data name here}"].ToString();
Uma maneira um pouco mais elegante de fazer o mesmo adicionando ao comentário acima.
<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>
E no lado do servidor:
protected void deleteRow(object sender, GridViewDeleteEventArgs e)
{
string IdTemplate= e.Values["IdTemplate"].ToString();
string EntityId = e.Values["EntityId"].ToString();
// Do stuff..
}
Armazene -o na coleção GridView Datakeys ou armazenar -a em um campo oculto dentro da mesma célula ou junte os valores. Essa é a unica maneira. Você não pode armazenar dois valores em um link.
Se você quiser passar dois valores, você pode usar esta abordagem
<asp:LinkButton ID="RemoveFroRole" Text="Remove From Role" runat="server"
CommandName='<%# Eval("UserName") %>' CommandArgument='<%# Eval("RoleName") %>'
OnClick="RemoveFromRole_Click" />
Basicamente, estou tratando {CommmandName, Commandargument} como o valor da chave. Defina ambos no campo do banco de dados. Você terá que usar o evento OnClick e usar OnCommand
Evento neste caso, que eu acho que é um código mais limpo.