ASP.NET - 控制事件不在中继器内部触发

标签 asp.net events user-controls postback

这是一个非常普遍的问题,并且已经用尽了所有明显的解决方案,我希望 SO 可以为我提供一些输入......我在一个页面中有一个 UserControl,其中包含一个包含多个控件的转发器,这些控件会导致回发。问题是,转发器内部的所有控件在回发时从未命中它们的事件处理程序,但转发器外部(仍在 UC 中)的控件得到正确处理。我已经确定我的控件不会因为丢失 if(!IsPostBack) 而重新生成我验证了 Request.Form["__EVENTTARGET"] 在 Page_Load 事件中包含正确的控件 ID。我试图在一个单独的项目中重现这些症状,并且它按预期工作。

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="NoteListControl.ascx.cs"
    Inherits="SantekGBS.Web.UserControls.NoteListControl" %>

<asp:UpdatePanel ID="upNotes" runat="server" UpdateMode="Conditional">
    <ContentTemplate>
        <div class="NoteList" id="divNoteList" runat="server">
            <asp:Repeater ID="repNotes" runat="server">
                <HeaderTemplate>
                    <table width="98%" cellpadding="3" cellspacing="0">
                </HeaderTemplate>
                <ItemTemplate>
                    <tr class="repeaterItemRow">
                        <asp:ImageButton ID="ImageButton1" runat="server" ImageUrl="~/Content/images/DeleteIcon.gif"
                            OnClick="ibRemove_Click" CommandArgument='<%# Container.ItemIndex %>' CommandName='<%# Eval("ID") %>'
                            CausesValidation="false" AlternateText="Delete" />
                        <%# Eval("Text") %></td>
                    </tr>
                </ItemTemplate>
                <FooterTemplate>
                    </table>
                </FooterTemplate>
            </asp:Repeater>
            <asp:PlaceHolder ID="phNoNotes" runat="server" Visible="false">
                <div class="statusMesssage">
                    No notes to display.
                </div>
            </asp:PlaceHolder>
        </div>
    </ContentTemplate>
</asp:UpdatePanel>
public partial class NoteListControl : UserControl
{
    [Ninject.Inject]
    public IUserManager UserManager { get; set; }

    protected List<Note> Notes
    {
        get
        {
            if (ViewState["NoteList"] != null)
                return (List<Note>)ViewState["NoteList"];
            return null;
        }
        set { ViewState["NoteList"] = value; }
    }

    public event EventHandler<NoteEventArgs> NoteAdded;
    public event EventHandler<NoteEventArgs> NoteDeleted;
    public event EventHandler<NoteEventArgs> NoteChanged;

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            UtilityManager.FillPriorityListControl(ddlPriority, false);
        }
    }

    protected void ibRemove_Click(object sender, ImageClickEventArgs e)
    {
        System.Diagnostics.Debug.WriteLine("ibRemove POSTBACK"); // This is NEVER hit
    }

    public void Fill(List<Note> notes)
    {
        Notes = notes;
        RefreshRepeater();
    }

    private void RefreshRepeater()
    {
        if (Notes != null && Notes.Any())
        {
            var sorted = Notes.OrderByDescending(n => n.Timestamp);
            Notes = new List<Note>();
            Notes.AddRange(sorted);
            repNotes.Visible = true;
            phNoNotes.Visible = false;
            repNotes.DataSource = Notes;
            repNotes.DataBind();
        }
        else
        {
            repNotes.Visible = false;
            phNoNotes.Visible = true;
        }
    }
}

public class NoteEventArgs : EventArgs
{
    public Note Note { get; set; }
    public NoteEventArgs()
    { }
    public NoteEventArgs(Note note)
    {
        this.Note = note;
    }
}

该代码故意缺少功能,因此请忽略该事实。

最佳答案

您编辑的代码有残留 CommandArgumentCommandName特性;你真的在处理 Repeater.ItemCommand事件?

如果是这样,并且您的页面调用控件的 Fill回发的方法,这将解释它。

在这些帖子中解释了这个经典的 ASP.NET 撕裂问题:A Stumper of an ASP.NET QuestionA Stumper of an ASP.NET Question: SOLVED!

解释有点令人费解,但关键是Repeater.DataBind干扰 ASP.NET 确定哪个中继器按钮导致回发的能力。

关于ASP.NET - 控制事件不在中继器内部触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1785764/

相关文章:

jquery - 如何将 jQuery UI 代码添加到 ASP.NET Web 窗体页面?

c# - 将皮肤应用于以编程方式创建的控件

c# - 将 'Handles' 从 VB.NET 迁移到 C#

c# - 使用对象列表填充 UserControl Gridview

c# - 从工具箱中的程序集隐藏所有 WPF 用户控件

c# - 用户控制自定义事件并设置获取属性

.net - 从 .NET 框架内部记录 (Logging.On)

c# - ASP.NET Core 在 Forbid() 上给我代码 500

c# - Winform布局完成后触发事件

events - 如何使用特定的KeyCode调度KeyboardEvent