commandargument字符串未评估

时间:2009-10-29 14:42:39

标签: c# asp.net

我在一个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,为什么不进行评估?虽然我所有其他变量的评估都很好吗?

5 个答案:

答案 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)

你要做的事情是行不通的。你可以做的一些事情作为替代品。

  1. 用转发器替换for循环,然后使用数据绑定设置属性。在评论中你提到你将要转向MVC。我相信仍然支持Repeater控件,无论如何你都需要更换LinkBut​​ton。

  2. 如果你因为转移到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:LinkBut​​ton控件中,&lt; %%&gt;没有被执行 - 它只是被视为一个字符串,因为它被包装在引号中。

答案 4 :(得分:0)

CommandEventArgs是否存在问题?我一直只使用常规的EventArgs,但我将发送者解析回LinkBut​​ton是直接引用它的CommandArgument。

protected void deleteButton_Click(object sender, EventArgs e)
    {
        LinkButton theSender = (LinkButton)sender;
        int imageId = System.Convert.ToInt32(theSender.CommandArgument.ToString());
    }