web-dev-qa-db-fra.com

LinkButton CommandName et CommandArgument

J'ai du mal à comprendre CommandName et CommandArgument associés à un lien Link ASP.NET. J'ai lu cet article - http://msdn.Microsoft.com/en-us/library/system.web.ui.webcontrols.button.commandname.aspx et d'autres questions sur ce site.

Je suppose que mes questions sont - qu'est-ce qu'une "Commande" exactement? Un CommandName peut-il être n'importe quel texte? Je vois "Trier" et "Soumettre" comme exemples. Et quant à CommandArgument, il est juste utilisé pour spécifier davantage le type de "Command". Correct? Merci beaucoup pour votre aide.

18
A Bogus

Un Command peut être tout ce que vous voulez qu'il soit.

L'idée de base est que si vous dites avoir un répéteur, et dans ce répéteur vous avez plusieurs options, vous pouvez donner à chaque option un CommandName différent. Le CommandArgument serait alors basé sur l'identifiant unique de la ligne.

Ensuite, dans le post-back, vous pouvez vérifier quel CommandName a été tiré et en fonction de cela, utilisez la valeur dans le CommandArgument

Par exemple, la majoration pourrait ressembler à quelque chose comme ...

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

Ensuite, votre gestionnaire de post-pack pourrait vérifier lequel a été cliqué ...

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

CommandName peut être n'importe quelle chaîne oui. Mais attention! ASP.NET traitera certaines chaînes de manière spéciale. Par exemple si vous avez un contrôle Button dans une colonne GridView avec un CommandName de "delete" "il déclenchera l'événement OnDeleting et le CommandArgument aura été défini sur l'index de ligne du GridViewRow dans lequel se trouve le bouton. Sinon, comme d'autres l'ont publié, vous pouvez utiliser les CommandName et CommandArgument conviennent cependant le mieux à votre situation.

en général, vous définissez CommandArgument comme l'index de ligne du conteneur parent du contrôle lors de la liaison, et le CommandName comme quelque chose de significatif pour votre domaine d'application, tel que "UpdateFoo". Vous l'utilisez ensuite dans le gestionnaire d'événements OnRowCommand pour déterminer le bouton sur lequel vous avez cliqué et, par conséquent, la logique métier à exécuter.

5
Black Squirrel

CommandName est ce que vous faites réellement lorsque l'événement est déclenché et le CommandArgument et bien sûr est l'argument lié au processus. Cela a plus de sens si vous utilisez des boutons de lien dans le répéteur ou des éléments de liste similaires. Dans ce cas, votre CommandName peut être "Supprimer", "Modifier", "Publier" et pour ce processus, vous devez savoir quel enregistrement vous traitez et "CommandArgument" est votre homme dans ce cas, vous pouvez affecter il l'ID ou les données séparées par des virgules à traiter.

Bien sûr, vous pouvez également l'utiliser pour fusionner des événements similaires. "Trier" en est un excellent exemple, car vous pouvez donner "CommandArgument" comme "Prix asc", "Date asc", "Date desc", tous vos boutons de lien déclenchent l'événement.

2
Onur Topal

Comme le dit Freefaller, CommandName et CommandArgument ne sont que des valeurs de chaîne.

La raison pour laquelle il y a plusieurs fois, cependant, un événement de clic déclenchera simplement le clic d'un bouton et vous gérerez ce (s) bouton (s) spécifiquement.

Un bon exemple de l'utilisation des boutons de commande est d'imaginer que vous avez des lignes de données, chaque ligne a la possibilité de visualiser, modifier ou supprimer.

Plutôt que de coder séparément pour chacun, vous pouvez utiliser les parties Command et avoir chaque ligne le CommandArgument de l'ID d'enregistrement et le CommandArgument pour être l'action que vous souhaitez effectuer; ViewRec,EditRec andDelRec` par exemple:

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

En utilisant cet exemple comme concept, montre que vous n'avez alors qu'une seule section de code pour gérer plusieurs options et donc un seul endroit pour maintenir etc ...

0
RemarkLima