Đây là một vấn đề phổ biến vô lý và đã cạn kiệt tất cả các giải pháp rõ ràng, tôi hy vọng SO có thể cung cấp cho tôi một số đầu vào ... Tôi có một UserControl bên trong một trang chứa một bộ lặp có một số điều khiển gây ra postback. Rắc rối là, tất cả các điều khiển bên trong của bộ lặp không bao giờ nhấn xử lý sự kiện của họ khi họ postback, nhưng điều khiển bên ngoài của repeater (vẫn còn trong UC) được xử lý một cách chính xác. Tôi đã đảm bảo rằng các điều khiển của tôi không được tái tạo do thiếu if(!IsPostBack)
và tôi đã xác minh rằng Request.Form ["__ EVENTTARGET"] chứa ID kiểm soát chính xác trong sự kiện Page_Load. Tôi đã cố gắng tái tạo các triệu chứng trong một dự án riêng biệt và nó đã hoạt động như mong muốn.ASP.NET - Kiểm soát sự kiện không kích hoạt bên trong Repeater
<%@ 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;
}
}
Mã này được cố tình thiếu chức năng vì vậy chỉ cần bỏ qua thực tế là.
Bắt tốt, nhưng bạn thực sự có thể bỏ qua điều đó. Đánh dấu tôi đang hiển thị thậm chí không giống như mã sản xuất. Tôi tạo ra chỉ để hiển thị hiệu ứng. Tất cả các điều khiển bên trong ItemTemplate đều hoạt động theo cùng một cách. –