2012-11-13 147 views
15

我无法理解与ASP.NET LinkBut​​ton关联的CommandNameCommandArgument。我已阅读此文章 - http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.button.commandname.aspx以及本网站上的其他问题。LinkBut​​ton CommandName和CommandArgument

我想我的问题是 - 什么是“命令”? CommandName基本上可以是任何文本?我将“排序”和“提交”作为示例。至于CommandArgument,这只是用来进一步指定“命令”的类型。正确? 非常感谢您的帮助。

回答

25

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

真棒解释,freefaller!谢谢! –

+0

这里没有解释的是,asp:linkbutton如何触发命令以及在哪里。我的意思是,我有一个带CommandName =“Delete”的链接按钮,这会触发我的SqlDataSource中的DeleteCommand,它会从我们的数据库中删除一条记录。但是,如果将其重命名为CommandName =“MyDeleteFunction”,则不再调用DeleteCommand。没关系,但我该如何捕获我的新命令名称;我不希望它在服务器端。我相信CommanName不是服务器端事件。 – Fandango68

2

CommandName是你实际做的时候日e事件被触发,并且当然是与过程相关的论点。如果您使用中继器或类似列表项目中的链接按钮,则更有意义。在这种情况下,你的CommandName可以是“删除”,“编辑”,“发布”,对于这个过程你需要知道你正在处理哪个记录,而'CommandArgument'是你的男人,在这种情况下你可以给它分配ID或逗号分离数据进行处理。

当然你也可以用它来合并类似的事件“Sort”就是一个很好的例子,你可以给'CommandArgument'作为“Price asc”,“Date asc”,“Date desc”触发事件。

0

正如freefaller所说,CommandNameCommandArgument都只是字符串值。

许多折叠的原因,但点击事件只会触发一个按钮的点击,你特别处理该按钮(s)。

使用CommandButtons的一个很好的例子是想象你有数据行,每行都有查看,编辑或删除的能力。

不是seperately为每一个代码,则可以使用Command的部分,具有每排有记录ID的CommandArgument,并且CommandArgument为要执行的行动; ViewRec, EditRec and DelRec`例如:

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

使用这些例子只是一个概念,表明你那么只有有代码来处理多个选项,因此只有一个地方维护等一个部分......

4

CommandName可以是任何字符串是。 但要小心! ASP.NET将以特殊方式处理某些字符串。例如,如果在GridView列中具有“删除”的CommandName的按钮控件,将会引发OnDeleting事件,并且CommandArgument将被设置为该按钮所在的GridViewRow的行索引。否则,如其他人一样张贴您可以使用CommandNameCommandArgument但最适合您的情况。

通常,您将在绑定期间将CommandArgument设置为控件的父容器的行索引,并且CommandName对您的应用程序域有意义,例如“UpdateFoo”。然后,您可以在OnRowCommand事件处理程序中使用它来确定哪个按钮已被点击,从而确定要执行的业务逻辑。

相关问题