2012-11-13 11 views
15

Non riesco a comprendere CommandName e CommandArgument associato a un LinkButton ASP.NET. Ho letto questo articolo - http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.button.commandname.aspx e altre domande su questo sito.LinkButton CommandName e CommandArgument

Credo che le mie domande siano: cos'è esattamente un "comando"? Può un CommandName fondamentalmente un testo qualsiasi? Vedo "Ordina" e "Invia" come esempi. E per quanto riguarda CommandArgument, questo è solo usato per specificare ulteriormente il tipo di "Comando". Corretta? Grazie mille per il tuo aiuto.

risposta

25

A Command può essere qualsiasi cosa tu voglia che sia.

L'idea di base è che se si dice di avere un ripetitore e in quel ripetitore si hanno più opzioni, è possibile assegnare a ciascuna opzione un diverso CommandName. Il CommandArgument sarà quindi basato sull'identificatore univoco della linea.

Poi sul post-retro è possibile verificare quale CommandName è stato licenziato e sulla base che utilizzano il valore nel CommandArgument

Ad esempio, il mark-up potrebbe essere simile ...

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

Allora il tuo gestore di post-pacchetto potrebbe controllare per vedere quale è stato fatto clic ...

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

Impressionante spiegazione, freefaller! Grazie! –

+0

Ciò che non è spiegato qui è come l'asp: linkbutton attiva il comando e dove. Quello che voglio dire è che ho un linkbutton con CommandName = "Elimina" e questo spara il DeleteCommand nel mio SqlDataSource che cancella un record dal nostro database. Ma se lo rinominano in CommandName = "MyDeleteFunction", DeleteCommand non viene più chiamato. Va bene, ma come faccio a intercettare il mio nuovo nome di comando; e non voglio che sia sul lato server. Credo che CommanName NON sia un evento lato server. – Fandango68

2

CommandName è quello che in realtà fare quando esimo L'evento viene attivato e lo CommandArgument e, naturalmente, l'argomento relativo al processo. Ha più senso se si utilizzano i pulsanti di collegamento nel ripetitore o voci di elenco simili. In questo caso il tuo CommandName può essere "Cancella", "Modifica", "Pubblica" e per questo processo devi sapere quale record hai a che fare e 'CommandArgument' è il tuo uomo in questo caso puoi assegnargli l'ID o la virgola dati separati da elaborare.

Ovviamente è possibile utilizzarlo per unire eventi simili "Ordina" è un ottimo esempio per questo dato che puoi dare "CommandArgument" come "Prezzo asc", "Data asc", "Data desc" tutti i tuoi pulsanti di collegamento innesca l'evento.

0

Come dice freefaller, sia il CommandName e CommandArgument sono solo valori stringa.

Il motivo per cui è molti fold, tuttavia un evento click semplicemente spara il clic di un pulsante e lo gestisci in modo specifico.

Un buon esempio dell'uso di CommandButtons è immaginare di avere righe di dati, ogni riga ha la possibilità di visualizzare, modificare o eliminare.

Invece di codice per ciascuno di essi separatamente, è possibile utilizzare le Command parti e hanno ciascuna riga hanno la CommandArgument dell'ID record e il CommandArgument ad essere l'azione che si desidera eseguire; ViewRec, EditRec and DelRec` ad esempio:

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

Utilizzando questo esempio come concetto, mostra che allora avete una sola sezione di codice per gestire più opzioni e quindi solo un posto per mantenere ecc ...

4

CommandName può essere qualsiasi stringa sì. Ma attenzione! ASP.NET tratterà determinate stringhe in un modo speciale. Per esempio, se si dispone di un controllo Button in una colonna GridView con un CommandName di "delete" alzerà l'evento OnDeleting e la CommandArgument sarà stato impostato per l'indice di riga del GridViewRow che il pulsante è in. In caso contrario, come altri hanno pubblicato è possibile utilizzare il CommandName e CommandArgument tuttavia meglio si adatta alle circostanze.

genere si imposterà il CommandArgument essere l'indice di riga del contenitore padre del controllo durante la rilegatura e la CommandName di essere qualcosa di significativo per il vostro dominio di applicazione, come ad esempio "UpdateFoo." Quindi lo si utilizza nel gestore di eventi OnRowCommand per determinare quale pulsante è stato selezionato e quindi quale logica aziendale eseguire.