通过www.example.com中按钮的CommandArgument传递多个参数Asp.net

pexxcrt2  于 2022-12-27  发布在  .NET
关注(0)|答案(7)|浏览(149)

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

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

需要注意的是,这些值不能从页面上的任何控件中检索,因此我目前不寻求任何设计解决方案。

egdjgwm8

egdjgwm81#

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

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

mkh04yzy2#

在四处打探之后,凯尔西似乎是正确的。
当你想吃的时候,就用逗号之类的东西把它分开。

wz1wpwve

wz1wpwve3#

@帕特里克的回答是个好主意,值得更多的赞扬!.你可以拥有你想要的任意多的数据项,它们都是独立的,如果需要的话可以在客户端使用。
它们也可以声明性地添加,而不是在代码中添加。我刚刚为这样的GridView做了这样的操作:

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

在行命令中,执行以下操作:

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

这比把所有的值和分隔符放在一起,然后在最后再次解包要干净得多。
不要忘记测试/清理从页面返回的任何数据,以防数据被篡改!

t2a7ltrp

t2a7ltrp4#

我的方法是使用attributes集合从代码后面添加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();
dpiehjr4

dpiehjr45#

一个更优雅的方式做同样的添加到上面的评论..

<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..
}
3df52oht

3df52oht6#

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

myzjeezk

myzjeezk7#

如果要传递两个值,可以使用此方法

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

基本上我把{CommmandName,CommandArgument}当作键值。从数据库字段设置这两个。在这种情况下,你必须使用OnClick事件和OnCommand事件,我认为这是更干净的代码。

相关问题