我在一个aspx页面内有一个命令规则,设置为for循环中的一个对象变量,如下所示:
<% foreach (PromotionImage p in imageList)
{
%>
<asp:LinkButton runat="server" OnCommand="deleteButton_Click" ID="deleteButton" CommandArgument="<%# p.ImageId.ToString(); %>" ForeColor="Red"
OnClientClick="javascript:return confirm('Are you sure you want to delete this item?');">X</asp:LinkButton>
<%
}
%>
然后在我的c#代码后面我有以下内容来尝试获取此值:
protected void deleteButton_Click(object sender, CommandEventArgs e)
{
int imageId = System.Convert.ToInt32(e.CommandArgument.ToString());
}
但是c#代码不断返回“System.FormatException:输入字符串的格式不正确。”
调试e.CommandArgument时包含字符串“&lt;%#p.ImageId.ToString();%&gt;”而不是实际的ImageId,为什么不进行评估?虽然我所有其他变量的评估都很好吗?
答案 0 :(得分:2)
使用<%# %>
用于绑定。
改为使用<%= p.propertyblahblah %>
。
此外,不要这样做:commandArgument =“...”但改为使用单引号;还有';'可以在你的陈述结束时删除。
-edit:最后一件事:只需使用转发器。
-edit2:好的。除非你使用转发器或其他类型的数据绑定控制,否则这确实不会起作用。 或你必须在真实的代码中执行此操作,如:
protected void Page_Load(object sender, EventArgs e)
{
for (int i = 0; i < 10; i++)
{
LinkButton l = new LinkButton
{
CommandArgument = i.ToString(),
Text = i.ToString(),
};
l.Click += test_onclick;
holder.Controls.Add(l);
}
}
protected void test_onclick(object sender, EventArgs e)
{
var x = ((LinkButton)sender).CommandArgument;
}
答案 1 :(得分:1)
你要做的事情是行不通的。你可以做的一些事情作为替代品。
用转发器替换for循环,然后使用数据绑定设置属性。在评论中你提到你将要转向MVC。我相信仍然支持Repeater控件,无论如何你都需要更换LinkButton。
如果你因为转移到MVC而必须使用for循环,那么你需要写出自己的超链接标记。像这样:
<a onclick="javascript:return confirm('Are you sure you want to delete this item?');" href="<%=Page.GetPostBackClientHyperlink(this, p) %>" style="color:Red;">X</a>
然后你需要在Page类中添加一个RaisePostBackEvent方法:
public void RaisePostBackEvent(string eventArgument)
{
...
}
当您将此页面转换为MVC,然后使用Html.ActionLink或Url.Action调用替换超链接,并将RaisePostBackEvent逻辑拉入您的控制器。
答案 2 :(得分:0)
您是否尝试过“&lt;%= p.ImageId.ToString();%&gt;”
=而不是#
我认为#用于数据绑定,就像在网格视图中一样。
希望有所帮助
答案 3 :(得分:0)
我绝对没有经典的ASP经验,但从我的测试来看,看起来你无法在设置为在服务器上运行的控件中评估你的C#代码。例如,以下工作:
<%
For x As Integer = 1 To 10
%>
<p><%=x%></p>
<%
Next
%>
虽然这不起作用:
<%
For x As Integer = 1 To 10
%>
<p runat="server"><%=x%></p>
<%
Next
%>
因此,在你的asp:LinkButton控件中,&lt; %%&gt;没有被执行 - 它只是被视为一个字符串,因为它被包装在引号中。
答案 4 :(得分:0)
CommandEventArgs是否存在问题?我一直只使用常规的EventArgs,但我将发送者解析回LinkButton是直接引用它的CommandArgument。
protected void deleteButton_Click(object sender, EventArgs e)
{
LinkButton theSender = (LinkButton)sender;
int imageId = System.Convert.ToInt32(theSender.CommandArgument.ToString());
}