web-dev-qa-db-fra.com

Passage de plusieurs arguments via CommandArgument de Button dans Asp.net

J'ai un gridview avec plusieurs lignes, chacune a un bouton de mise à jour et je dois passer 2 valeurs lorsque quelqu'un clique sur le bouton de mise à jour. Mis à part le fait que les arguments contenus dans CommandArgument sont séparés par des virgules (archaïque et non élégante), comment puis-je passer plus d'un argument?

<asp:LinkButton ID="UpdateButton" runat="server" CommandName="UpdateRow" CommandArgument="arg_value" Text="Update and Insert" OnCommand="CommandButton_Click" ></asp:LinkButton>

Remarque: les valeurs ne peuvent être extraites d'aucun contrôle de la page. N'offrez donc aucune solution de conception. Veuillez vous concentrer sur la question posée. Merci d'avance.

23
sarsnake

Après avoir fouillé, Kelsey semble avoir raison.

Utilisez simplement une virgule ou quelque chose et divisez-la lorsque vous souhaitez la consommer.

14
cazlab

Vous pouvez passer des valeurs séparées par des points-virgules en tant qu'argument de commande, puis diviser la chaîne et l'utiliser.

<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>

côté serveur

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");
}

J'espère que ça aide!!!!

73
Archana Motagi

@ La réponse de Patrick est une bonne idée et mérite plus de crédit !. Vous pouvez avoir autant d'éléments de données que vous le souhaitez, ils sont tous séparés et peuvent être utilisés côté client si nécessaire.

Ils peuvent également être ajoutés de manière déclarative plutôt que dans le code. Je viens de faire ceci pour un GridView comme ceci:

<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>

Dans le RowCommand, vous faites ceci:

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
    }
}

Tellement plus propre que de pirater toutes les valeurs avec des délimiteurs et de les décompresser à la fin.

N'oubliez pas de tester/nettoyer toutes les données que vous récupérez de la page, au cas où elles auraient été altérées! 

13
cyberspy

Mon approche utilise la collection d'attributs pour ajouter des attributs HTML de données HTML à partir de code derrière. Ceci est plus en ligne avec les scripts jQuery et côté client.

// 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() );

Récupérez ensuite les valeurs via la collection d'attributs

string val = targetBtn.Attributes["data-{your data name here}"].ToString();
5
Patrick Boudreau

Une façon un peu plus élégante de faire la même chose en ajoutant au commentaire ci-dessus.

<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>

Et du côté du serveur:

protected void deleteRow(object sender, GridViewDeleteEventArgs e)
{
    string IdTemplate= e.Values["IdTemplate"].ToString();
    string EntityId = e.Values["EntityId"].ToString();

   // Do stuff..
}
3
Nemo

Stockez-le dans la collection de gridview datakeys ou stockez-le dans un champ masqué à l'intérieur de la même cellule ou associez les valeurs. C'est la seule façon. Vous ne pouvez pas stocker deux valeurs dans un seul lien.

1
Brian Mains

Si vous voulez passer deux valeurs , vous pouvez utiliser cette approche

<asp:LinkButton ID="RemoveFroRole" Text="Remove From Role" runat="server"
CommandName='<%# Eval("UserName") %>' CommandArgument='<%# Eval("RoleName") %>'
 OnClick="RemoveFromRole_Click" />

Fondamentalement, je traite {CommmandName, CommandArgument} comme une valeur clé. Définissez les deux à partir du champ de la base de données. Vous devrez utiliser l'événement OnClick et utiliser l'événement OnCommand dans ce cas, ce qui, je pense, est un code plus propre.

0
Hammad Khan