如何在重复控件中使用按钮?

11

我正在使用带有C#的ASP.NET 3.5。我想在Repeater控件内调用按钮点击事件。

<asp:Repeater ID="rptFriendsList"
    runat="server" 
    onitemcommand="rptFriendsList_ItemCommand">
    <ItemTemplate> 
        <asp:ImageButton ID="btnSave"
                         runat="server" 
                         ImageUrl="~/Contents/Images/save_button.png"
                         CommandName="Schedule"
                         UseSubmitBehavior="False"  />
    </ItemTemplate>
</asp:Repeater>

当我点击一个按钮时,它会出现错误。

“无效的回发或回调参数。事件验证已启用,使用配置中的<%@ Page EnableEventValidation="true" %>,或在页面上启用。出于安全考虑,此功能验证回发或回调事件的参数是否源自最初呈现它们的服务器控件。如果数据有效且预期,请使用ClientScriptManager.RegisterForEventValidation方法注册回发或回调数据以进行验证。”

我的目的是在重复器内部放置一个按钮,并在点击按钮时执行一些代码。请帮助我解决这个问题。提前感谢您。


你是如何向重复器的数据源中添加项目的(以及何时添加)? - SWeko
7个回答

5
<asp:Repeater ID="Repeater1" runat="server"      OnItemCommand="Repeater1_OnItemCommand"  DataSourceID="SqlDataSource1">


            <ItemTemplate>
                key1:
                <asp:Label ID="key1Label" runat="server" Text='<%# Eval("key1") %>'></asp:Label><br />
                key2:
                <asp:Label ID="key2Label" runat="server" Text='<%# Eval("key2") %>'></asp:Label><br />
                key3:
                <asp:Label ID="key3Label" runat="server" Text='<%# Eval("key3") %>'></asp:Label><br />
                <asp:TextBox ID="col1" runat="server" Text='<%# Eval("col1") %>'></asp:TextBox>
                <asp:TextBox ID="col2" runat="server" Text='<%# Eval("col2") %>'></asp:TextBox>


                <br />


                <asp:linkbutton ID="Linkbutton1" commandname="Update" runat="server" text="Update"  CommandArgument='<%# Eval("key1") +"|"+Eval("key2")+"|"+ Eval("key3") %>' />
               <asp:linkbutton ID="Linkbutton2" commandname="Cancel" runat="server" text="Cancel" />


            </ItemTemplate>



 protected void Repeater1_OnItemCommand(object source, RepeaterCommandEventArgs e)
    {
        if (e.CommandName == "Update")
        {

            string col1 = ((TextBox)e.Item.FindControl("col1")).Text;
            string col2 = ((TextBox)e.Item.FindControl("col2")).Text;


            string allKeys = Convert.ToString(e.CommandArgument);

            string[] arrKeys = new string[2];
            char[] splitter = { '|' };
            arrKeys = allKeys.Split(splitter);



            SqlDataSource1.UpdateParameters["col1"].DefaultValue = col1;
            SqlDataSource1.UpdateParameters["col2"].DefaultValue = col2;

            SqlDataSource1.UpdateParameters["key1"].DefaultValue = arrKeys[0];
            SqlDataSource1.UpdateParameters["key2"].DefaultValue = arrKeys[1];
            SqlDataSource1.UpdateParameters["key3"].DefaultValue = arrKeys[2];


            SqlDataSource1.Update();          

            Repeater1.DataBind();

        }
    }

5

UseSubmitBehavior="False" 这个属性是你使用的,但在图像按钮中没有这个属性。你是否覆盖了imagebutton类并添加了这个属性?


2
这也会发生在你把数据源分配并绑定到重复器的OnLoad事件而不是OnInit事件中。

1

我已经使用了下面的代码,运行良好 在.aspx页面中使用下面的代码

<asp:Repeater ID="Repeater1" runat="server" OnItemCommand="Repeater1_ItemCommand">
    <HeaderTemplate>
        <table>
            <tr>
                <th>
                    Edit
                </th>
            </tr>
        </table>
    </HeaderTemplate>
    <ItemTemplate>
        <table>
            <tr>
                <td align="center">
                    <asp:LinkButton ID="LinkButton1" runat="server" CommandName="Edit">Edit</asp:LinkButton>
                </td>
            </tr>
        </table>
    </ItemTemplate>
</asp:Repeater>

在 .cs 文件中使用,创建事件 Repeater1_ItemCommand。

protected void Repeater1_ItemCommand(object source, RepeaterCommandEventArgs e)
{

    switch (e.CommandName)
    {
        case "Edit":
            // Do some stuff when the Edit button is clicked.

            break;

        // Other commands here.

        default:
            break;
    }

}

1

您不能使用按钮,因为单击按钮会创建回发,而且repeater的itemcommand也被调用!

但是,如果您想使用asp:button而不是asp:linkbutton,则必须将按钮的UseSubmitBehavior属性设置为false。这意味着按钮不会进行回发。

<asp:Button ID="btnAccept" runat="server" Text="Accept All" CssClass="vb-default vb-green vb-txt-light" CommandName="Accept" CommandArgument='<%# Eval("UserID") %>' UseSubmitBehavior="false" />

-1

设置页面 EnableEventValidation="false"。


2
这是一个最后的手段选项 - EventValidation可以防止各种恶意内容被提交到您的网站。 - kͩeͣmͮpͥ ͩ

-2
如果您正在服务器端添加项目,请尝试为每个ImageButton分配唯一的ID。

如果它们在重复器中,则默认情况下会获得一个唯一的ID,例如:rptFriendsList_ItemCommand_btnSave。 - kͩeͣmͮpͥ ͩ
如果ClientIDMode设置为Static会怎样? - Robert
2
那就是另一个问题了。 - kͩeͣmͮpͥ ͩ

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接