【问题标题】:How to use button in repeater control?如何在中继器控制中使用按钮?
【发布时间】:2011-03-15 09:50:38
【问题描述】:

我正在使用带有 c# 的 asp.net 3.5。我想在转发器控件中调用按钮单击事件。

<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>

但是当我点击一个按钮时它给出一个错误

"回传或回调无效 争论。启用事件验证 使用在 配置或 在一个 页。为了安全起见,这 功能验证参数 回发或回调事件起源 从服务器控制 最初呈现它们。如果数据 是有效的和预期的,使用 ClientScriptManager.RegisterForEventValidation 方法来注册 回发或回调数据 验证。”

我的目的是在按钮单击中执行一些代码,这些代码放置在中继器内。请帮我解决这个问题。提前致谢。

【问题讨论】:

  • 您如何将项目添加到转发器的数据源(以及何时)?

标签: c# asp.net repeater


【解决方案1】:

UseSubmitBehavior="False" 您使用的此属性不与图像按钮一起出现您是否覆盖了图像按钮类并添加了此属性。

【讨论】:

    【解决方案2】:
    <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();
    
            }
        }
    

    【讨论】:

      【解决方案3】:

      当您在 OnLoad 事件而不是 OnInit 中分配数据源和绑定转发器的数据时,也会发生这种情况

      【讨论】:

        【解决方案4】:

        我已经使用了下面的代码并且运行正常 在 .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;
            }
        
        }
        

        【讨论】:

          【解决方案5】:

          您不能使用按钮,因为按钮会在单击时创建回发,并且还会调用中继器的 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" />
          

          【讨论】:

            【解决方案6】:

            设置页面EnableEventValidation="false"。

            【讨论】:

            • 这是万不得已的选择 - EventValidation 可防止将各种邪恶提交到您的网站。
            【解决方案7】:

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

            【讨论】:

            • 如果他们在中继器中,默认情况下他们会获得一个 uniqueid,在这种情况下类似于:rptFriendsList_ItemCommand_btnSave)
            • 如果 ClientIDMode 设置为静态会怎样?
            • 那是另一个问题
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-07-16
            相关资源
            最近更新 更多