web-dev-qa-db-ja.com

LinkBut​​ton CommandNameおよびCommandArgument

ASP.NET LinkBut​​tonに関連付けられたCommandNameCommandArgumentを理解するのに問題があります。この記事を読んだ- http://msdn.Microsoft.com/en-us/library/system.web.ui.webcontrols.button.commandname.aspx およびこのサイトの他の質問。

私の質問は-「コマンド」とは何ですか? CommandNameは基本的に任意のテキストにできますか?例として「ソート」と「送信」が表示されます。 CommandArgumentに関しては、これは単に「コマンド」のタイプをさらに指定するために使用されます。正しい?ご協力ありがとうございます。

18
A Bogus

Commandには任意の名前を指定できます。

基本的な考え方は、リピーターがあり、そのリピーターに複数のオプションがある場合、各オプションに異なるCommandNameを指定できるということです。 CommandArgumentは、行の一意の識別子に基づいています。

その後、ポストバックで、どのCommandNameが起動されたかに基づいて、それに基づいてCommandArgumentの値を使用できます。

たとえば、マークアップは次のようになります。

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

その後、パック後のハンドラーがクリックされたものを確認できます...

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には任意の文字列yesを指定できます。 ただし、ASP.NETは特定の文字列を特別な方法で処理します。たとえば、GridView列にCommandNameが「delete」のButtonコントロールがある場合"OnDeletingイベントを発生させ、CommandArgumentはボタンが含まれるGridViewRowの行インデックスに設定されます。そうでない場合は、他のユーザーが投稿したように使用できますただし、CommandNameCommandArgumentは状況に最適です。

通常、バインド中にCommandArgumentをコントロールの親コンテナの行インデックスに設定し、CommandNameを「UpdateFoo」など、アプリケーションドメインにとって意味のあるものに設定します。次に、OnRowCommandイベントハンドラーでこれを使用して、クリックされたボタン、したがって実行するビジネスロジックを決定します。

5
Black Squirrel

CommandNameは、イベントがトリガーされたときに実際に行うことであり、CommandArgumentはもちろん、プロセスに関連する引数です。リピーターまたは同様のリストアイテムでリンクボタンを使用すると、より意味があります。その場合、CommandNameを「削除」、「編集」、「公開」することができ、このプロセスでは、どのレコードを扱っているかを知る必要があり、この場合「CommandArgument」はあなたが割り当てることができます処理するIDまたはコンマ区切りデータ。

もちろん、これを使用して同様のイベントをマージすることもできます。「ソート」は、「コマンド引数」を「価格asc」、「日付asc」、「日付desc」として指定できるため、すべてのリンクボタンがイベントをトリガーします。

2
Onur Topal

Freefallerが言うように、CommandNameCommandArgumentは両方とも単なる文字列値です。

なぜ多くのフォールドが発生するのかという理由は、クリックイベントがボタンのクリックを発生させるだけで、そのボタンを具体的に処理するためです。

CommandButtonsの使用の良い例は、データの行があり、各行に表示、編集、または削除の機能があることを想像してください。

それぞれ個別にコードを作成するのではなく、Commandパーツを使用して、各行にレコードIDのCommandArgumentと、希望するアクションにするCommandArgumentを持たせることができます。実行する; ViewRec,EditRec andDelRec`たとえば:

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

この例を概念として使用すると、複数のオプションを処理するコードのセクションが1つしかないため、保守する場所が1つだけであることがわかります。

0
RemarkLima