如何在ASP.NET中将C#变量作为CommandArgument传递
我正在动态创建一个数组,为一些数据的每个条目添加一行。每个条目都必须有一个按钮来做一些事情,但我在这一点上卡住了。我有以下代码来创建ASP.NET按钮: 问题是我没有成功地将这些C变量作为如何在ASP.NET中将C#变量作为CommandArgument传递,c#,asp.net,C#,Asp.net,我正在动态创建一个数组,为一些数据的每个条目添加一行。每个条目都必须有一个按钮来做一些事情,但我在这一点上卡住了。我有以下代码来创建ASP.NET按钮: 问题是我没有成功地将这些C变量作为CommandArgument和CommandName传递 我已经尝试过这些语法,下面是前面的一些问题: CommandArgument=”“ CommandArgument='' CommandArgument=”“ CommandArgument='' 但没有一个成功 编辑1: 如下所述,OnClick
CommandArgument
和CommandName
传递
我已经尝试过这些语法,下面是前面的一些问题:
CommandArgument=”“
CommandArgument=''
CommandArgument=”“
CommandArgument=''
OnClick
值应按如下方式替换:
<asp:Button ID="buttonyes" class="buttonyes" CommandArgument='<%= request.ID %>'
CommandName="AcceptRequest" OnCommand="ButtonPressed" runat="server"/>
顺便说一下,上面的代码不起作用,因为如上所述,这只适用于全局变量。您可以这样做:
CommandArgument='<%# request.ID %>'
CommandArgument=''
这样,将在数据桥接阶段分配
CommandArgument
。您可以这样做:
CommandArgument='<%# request.ID %>'
CommandArgument=''
这样,将在数据桥接阶段分配
CommandArgument
。我认为您的命令操作不正确
大多数人可能认为OnClick(),但您的方法签名与OnCommand()相关联
从
OnClick='<%= ButtonPressed %>'
我认为你的命令不正确 大多数人可能认为OnClick(),但您的方法签名与OnCommand()相关联 从
OnClick='<%= ButtonPressed %>'
为什么不省去很多麻烦,改用强类型的中继器控件呢。您可以使用
ItemType
属性使其类型安全。该值必须是类请求的完整命名空间
然后,您仍然可以像现在一样访问这些属性。但不是使用请求
,而是使用项的固定名称
<table border="1">
<asp:Repeater ID="Repeater1" runat="server" ItemType="Namespace1.Default1.request">
<ItemTemplate>
<tr>
<td><%# Item.applicant.Name + " (" + Item.applicant.ID + ")" %></td>
<td><%# Item.software.Name %></td>
<td><%# Item.date.ToLongDateString() %></td>
<td class="actions">
<asp:Button ID="buttonyes" class="buttonyes" CommandName="AcceptRequest" CommandArgument='<%# Item.Id %>' OnCommand="ButtonPressed" runat="server" />
<asp:Button ID="buttonno" class="buttonno" CommandName="RefuseRequest" CommandArgument='<%# Item.Id %>' OnCommand="ButtonPressed" runat="server" />
</td>
</tr>
</ItemTemplate>
</asp:Repeater>
</table>
现在您可以使用正常的数据绑定方式:CommandArgument=''
下面是测试的完整代码
public List<request> requests = new List<request>();
protected void Page_Load(object sender, EventArgs e)
{
//create some dummy data
for (int i = 0; i < 10; i++)
{
request r = new request() { Id = i, date = DateTime.Now };
r.applicant = new applicant() { Name = "Applicant " + i, ID = 1 + 100 };
r.software = new software() { Name = "Software " + i };
requests.Add(r);
}
if (!Page.IsPostBack)
{
Repeater1.DataSource = requests;
Repeater1.DataBind();
}
}
public class request
{
public int Id { get; set; }
public DateTime date { get; set; }
public applicant applicant { get; set; }
public software software { get; set; }
}
public class applicant
{
public int ID { get; set; }
public string Name { get; set; }
}
public class software
{
public int ID { get; set; }
public string Name { get; set; }
}
公共列表请求=新列表();
受保护的无效页面加载(对象发送方、事件参数e)
{
//创建一些虚拟数据
对于(int i=0;i<10;i++)
{
请求r=newrequest(){Id=i,date=DateTime.Now};
r、 申请人=新申请人(){Name=“申请人”+i,ID=1+100};
r、 软件=新软件(){Name=“software”+i};
请求。添加(r);
}
如果(!Page.IsPostBack)
{
Repeater1.DataSource=请求;
Repeater1.DataBind();
}
}
公共类请求
{
公共int Id{get;set;}
公共日期时间日期{get;set;}
公共申请人{get;set;}
公共软件{get;set;}
}
公开课申请人
{
公共int ID{get;set;}
公共字符串名称{get;set;}
}
公共类软件
{
公共int ID{get;set;}
公共字符串名称{get;set;}
}
为什么不省去很多麻烦,改用强类型中继器控件呢。您可以使用ItemType
属性使其类型安全。该值必须是类请求的完整命名空间
然后,您仍然可以像现在一样访问这些属性。但不是使用请求
,而是使用项的固定名称
<table border="1">
<asp:Repeater ID="Repeater1" runat="server" ItemType="Namespace1.Default1.request">
<ItemTemplate>
<tr>
<td><%# Item.applicant.Name + " (" + Item.applicant.ID + ")" %></td>
<td><%# Item.software.Name %></td>
<td><%# Item.date.ToLongDateString() %></td>
<td class="actions">
<asp:Button ID="buttonyes" class="buttonyes" CommandName="AcceptRequest" CommandArgument='<%# Item.Id %>' OnCommand="ButtonPressed" runat="server" />
<asp:Button ID="buttonno" class="buttonno" CommandName="RefuseRequest" CommandArgument='<%# Item.Id %>' OnCommand="ButtonPressed" runat="server" />
</td>
</tr>
</ItemTemplate>
</asp:Repeater>
</table>
现在您可以使用正常的数据绑定方式:CommandArgument=''
下面是测试的完整代码
public List<request> requests = new List<request>();
protected void Page_Load(object sender, EventArgs e)
{
//create some dummy data
for (int i = 0; i < 10; i++)
{
request r = new request() { Id = i, date = DateTime.Now };
r.applicant = new applicant() { Name = "Applicant " + i, ID = 1 + 100 };
r.software = new software() { Name = "Software " + i };
requests.Add(r);
}
if (!Page.IsPostBack)
{
Repeater1.DataSource = requests;
Repeater1.DataBind();
}
}
public class request
{
public int Id { get; set; }
public DateTime date { get; set; }
public applicant applicant { get; set; }
public software software { get; set; }
}
public class applicant
{
public int ID { get; set; }
public string Name { get; set; }
}
public class software
{
public int ID { get; set; }
public string Name { get; set; }
}
公共列表请求=新列表();
受保护的无效页面加载(对象发送方、事件参数e)
{
//创建一些虚拟数据
对于(int i=0;i<10;i++)
{
请求r=newrequest(){Id=i,date=DateTime.Now};
r、 申请人=新申请人(){Name=“申请人”+i,ID=1+100};
r、 软件=新软件(){Name=“software”+i};
请求。添加(r);
}
如果(!Page.IsPostBack)
{
Repeater1.DataSource=请求;
Repeater1.DataBind();
}
}
公共类请求
{
公共int Id{get;set;}
公共日期时间日期{get;set;}
公共申请人{get;set;}
公共软件{get;set;}
}
公开课申请人
{
公共int ID{get;set;}
公共字符串名称{get;set;}
}
公共类软件
{
公共int ID{get;set;}
公共字符串名称{get;set;}
}
而不是OnClick='
就我所知,它应该是OnClick=“ButtonPressed”
试试这个CommandArgument='
。你能准确地引用错误信息吗?正如grek40所说,就我所知,OnClick
似乎是无效属性,而不是CommandArgument
…它应该是OnClick=“ButtonPressed”
,而不是CommandArgument='
。你能准确地引用错误信息吗?正如grek40所说,OnClick
似乎是无效属性,而不是CommandArgument
…感谢您的回答,但当我尝试您的代码时,它会引发一个错误,表明请求
值不存在。但这一行是在一个循环中调用的,它将显示我需要的所有按钮,我100%确定我的请求变量已声明。@Louis'LYRO'Dupont请求应在aspx/ascx范围内定义。如果request
是局部变量,在某些方法中使用,那么这将不起作用。那么为什么不在代码中动态分配CommandArgument
public List<request> requests = new List<request>();
protected void Page_Load(object sender, EventArgs e)
{
//create some dummy data
for (int i = 0; i < 10; i++)
{
request r = new request() { Id = i, date = DateTime.Now };
r.applicant = new applicant() { Name = "Applicant " + i, ID = 1 + 100 };
r.software = new software() { Name = "Software " + i };
requests.Add(r);
}
if (!Page.IsPostBack)
{
Repeater1.DataSource = requests;
Repeater1.DataBind();
}
}
public class request
{
public int Id { get; set; }
public DateTime date { get; set; }
public applicant applicant { get; set; }
public software software { get; set; }
}
public class applicant
{
public int ID { get; set; }
public string Name { get; set; }
}
public class software
{
public int ID { get; set; }
public string Name { get; set; }
}