我正在动态创建一个数组,为某些数据的每个条目添加一行。每个条目都必须有一个按钮来完成它的一些操作,但我仍然坚持这一点。我有这段代码来创建 ASP.NET 按钮:
<asp:Button ID="buttonyes" class="buttonyes" CommandArgument='<%= request.ID %>'
CommandName="AcceptRequest" OnClick='<%= ButtonPressed %>' runat="server"/>
但是当我运行它时,我有多个错误说:
%=
和<
或>
表达式无效。
当我点击按钮时,我想调用与 index.aspx 链接的 index.aspx.cs 文件中写的函数,这里是{{ 1}}函数和此函数中的过滤器,它选择应该执行的操作:
ButtonPressed
问题在于我没有成功将这些 C#变量作为protected void ButtonPressed(Object sender, CommandEventArgs e)
{
Button btn = (Button)sender;
switch (btn.CommandName)
{
case "AcceptRequest":
AcceptRequest(btn.CommandArgument.ToString());
break;
case "RefuseRequest":
RefuseRequest(btn.CommandArgument.ToString());
break;
}
}
和CommandArgument
传递。
我已经尝试过这些语法,遵循以前的一些问题:
CommandName
CommandArgument="<%: request.ID %>"
CommandArgument='<%: request.ID %>'
CommandArgument="<%= request.ID %>"
但他们都没有工作。
编辑1:
如下所述@grek40,CommandArgument='<%= request.ID %>'
值应替换如下:
OnClick
编辑2:
我想知道如何传递C# 本地 变量,因为这些按钮应该添加到<asp:Button ID="buttonyes" class="buttonyes" CommandArgument='<%= request.ID %>'
CommandName="AcceptRequest" OnCommand="ButtonPressed" runat="server"/>
循环中,如下所示:
foreach
顺便说一下,上面的代码不起作用,因为正如@Nino所说,这只适用于全局变量。
答案 0 :(得分:3)
为什么不为自己省去很多麻烦并切换到强类型中继器控件。您可以使用ItemType
属性使其安全。该值必须是类request
然后您仍然可以像现在一样访问这些属性。但是,您使用固定名称request
。
Item
<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='<%# Item.Id %>'
在完整的测试代码下面......
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; }
}
答案 1 :(得分:2)
CommandArgument='<%# request.ID %>'
这种方式CommandArgument
将在DataBidning阶段分配。
答案 2 :(得分:1)
我认为您的命令操作不正确。
大多数人可能会想到OnClick(),但您的方法签名与OnCommand()
相关联从
改变 OnClick='<%= ButtonPressed %>'
到
OnCommand='<%= ButtonPressed %>'
OnClick签名是(object sender,EventArgs e)... OnCommand签名是(object sender,CommandEventArgs e)......并且预期的参数值应该是好的。
至于&#34; OnClick&#34;或者&#34; OnCommand&#34;,应该根据将处理呼叫的功能来修复,例如你的&#34; ButtonPressed&#34;方法。你不需要你的&#34;%&#34;包装器,因为函数没有改变...你的命令名称可以改变,但不能改变处理事件的方法......
OnClick='ButtonPressed'