我有一个包含多行的网格视图,每行都有一个“更新”按钮,当有人单击“更新”按钮时,我需要传递 2 个值。 除了将参数打包在 CommandArgument 中并用逗号分隔(过时且不优雅)之外,我如何传递多个参数?
<asp:LinkButton ID="UpdateButton" runat="server" CommandName="UpdateRow" CommandArgument="arg_value" Text="Update and Insert" OnCommand="CommandButton_Click" ></asp:LinkButton>
请注意,无法从页面上的任何控件检索这些值,因此我目前不寻求任何设计解决方案。
您可以传递分号分隔的值作为命令参数,然后拆分字符串并使用它。
<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");
}
@Patrick 的回答是个好主意,值得更多的信任!您可以拥有任意数量的数据项,它们都是分开的,并且可以在必要时在客户端使用。
它们也可以以声明方式添加,而不是在代码中。我刚刚为这样的 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>
在 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
}
}
比将所有值与分隔符放在一起并在最后再次解压要干净得多。
不要忘记测试/清理从页面返回的任何数据,以防它被篡改!
经过一番探索,凯尔西似乎是正确的。
想消费的时候就用逗号什么的把它分开。
我的方法是使用属性集合从代码隐藏添加 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();
在上面的评论中添加一个更优雅的方法..
<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..
}
将其存储在 gridview datakeys 集合中,或者将其存储在同一单元格内的隐藏字段中,或者将值连接在一起。这是唯一的办法。您无法在一个链接中存储两个值。
如果你想传递两个值,你可以使用这种方法
<asp:LinkButton ID="RemoveFroRole" Text="Remove From Role" runat="server"
CommandName='<%# Eval("UserName") %>' CommandArgument='<%# Eval("RoleName") %>'
OnClick="RemoveFromRole_Click" />
基本上我将 {CommandName,CommandArgument} 视为键值。从数据库字段设置两者。在这种情况下,您必须使用 OnClick 事件并使用
OnCommand
事件,我认为这是更干净的代码。
您可以使用分隔符分割参数(分隔符不得位于参数值内 - 例如“|”)。 参数名称必须是数据源的有效名称。 单引号表示命令参数,双引号表示参数名称。
<%-- BUTTON VIEWCMD --%>
<asp:TemplateField HeaderText="" SortExpression="" ItemStyle-CssClass="widthP07 textAlignCenter">
<ItemTemplate>
<asp:Button ID="ButtonVIEWCMD" runat="server" Text="View Detail"
CommandName="VIEWCMD"
CommandArgument='<%# Eval("param1") + "|" + Eval("param2") + "|" + Eval("param3") %>' />
</ItemTemplate>
</asp:TemplateField>
服务器代码
/// <summary>
/// SET - Process GridView Row Commands
/// </summary>
protected void GridView_RowCommand(object sender, GridViewCommandEventArgs e)
{
// INIT
string tempArguments = string.Empty;
try
{
// CTRL - gridview row click
switch (e.CommandName)
{
case "VIEWCMD":
// GET
tempArguments = (string)(e.CommandArgument);
// GET
string[] tempParam = tempArguments.Split('|');
// GET
// tempParam[0];
// tempParam[1];
// tempParam[2];
// .........
break;
default:
break;
}
}
catch (Exception ex)
{
// ERR .......
}
}