代码之家  ›  专栏  ›  技术社区  ›  sarsnake

通过ASP.NET中按钮的commandArgument传递多个参数

  •  23
  • sarsnake  · 技术社区  · 14 年前

    我有一个多行的网格视图,每个都有一个更新按钮,当有人单击更新按钮时,我需要传递2个值。 除了将参数打包在用逗号分隔的commandArgument中(过时且不优雅),如何传递多个参数?

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

    请注意,无法从页面上的任何控件中检索值,因此不要提供任何设计解决方案。请把注意力集中在所问的问题上。事先谢谢。

    7 回复  |  直到 8 年前
        1
  •  14
  •   Sid M Vladimir Enchev    11 年前

    在到处乱摸之后,看起来凯尔西是对的。

    只需使用逗号或其他东西,并在您想要使用它时将其拆分。

        2
  •  73
  •   mrk    13 年前

    可以将分号分隔的值作为命令参数传递,然后拆分字符串并使用它。

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

    在服务器端

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

    希望它有帮助!!!!!

        3
  •  13
  •   cyberspy    9 年前

    @帕特里克的回答是个好主意,值得更多的赞扬!。您可以拥有任意多的数据项,它们都是分开的,并且可以在必要时使用客户端。

    它们也可以声明性地添加,而不是在代码中添加。我这样做只是为了一个网格视图:

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

    在rowcommand中,执行以下操作:

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

    比将所有值与分隔符一起黑客处理并在最后再次解包要干净得多。

    别忘了测试/清理从页面返回的任何数据,以防被篡改!

        4
  •  5
  •   Patrick Boudreau    11 年前

    我的方法是使用属性集合添加HTML数据-代码背后的属性。这更符合jquery和客户端脚本。

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

    然后通过属性集合检索值

    string val = targetBtn.Attributes["data-{your data name here}"].ToString();
    
        5
  •  3
  •   Uwe Keim Tomasz    12 年前

    一种更优雅的方式来做同样的添加到上面的评论。

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

    在服务器端:

    protected void deleteRow(object sender, GridViewDeleteEventArgs e)
    {
        string IdTemplate= e.Values["IdTemplate"].ToString();
        string EntityId = e.Values["EntityId"].ToString();
    
       // Do stuff..
    }
    
        6
  •  1
  •   Brian Mains    14 年前

    要么将其存储在GridView数据键集合中,要么将其存储在同一单元格内的隐藏字段中,要么将值连接在一起。这是唯一的办法。不能在一个链接中存储两个值。

        7
  •  0
  •   TheTechGuy    8 年前

    如果你想通过 两个值 ,您可以使用此方法

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

    基本上,我将commmandname、commandArgument视为键值。从数据库字段同时设置。您必须使用onclick事件并使用 OnCommand 在这种情况下,我认为这是更干净的代码。