Dies ist ein absurd häufiges Problem und alle die offensichtlichen Lösungen erschöpft, ich hoffe, dass SO mir einige Eingaben bieten kann ... Ich habe ein UserControl innerhalb einer Seite, die enthält ein Repeater mit mehreren Steuerelementen, die Postback verursachen. Das Problem ist, dass alle Steuerelemente innerhalb des Repeaters ihre Ereignisbehandlungsroutinen beim Postback nie berühren, aber die Steuerungen außerhalb des Repeaters (immer noch im UC) werden korrekt behandelt. Ich habe bereits sichergestellt, dass meine Steuerelemente aufgrund einer fehlenden if(!IsPostBack)
nicht generiert wurden, und ich habe überprüft, dass Request.Form ["__ EVENTTARGET"] die richtige Steuerelement-ID in dem Ereignis Page Load enthielt. Ich habe versucht, die Symptome in einem separaten Projekt zu reproduzieren, und es funktionierte wie es sollte.ASP.NET - Control Events nicht innerhalb Repeater Firing
<%@ 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;
}
}
Der Code absichtlich Funktionalität fehlt so außer Acht lassen nur diese Tatsache.
Guter Fang, aber Sie können das tatsächlich ignorieren. Das Markup, das ich zeige, ist nicht dasselbe wie der Produktionscode. Ich habe das nur erstellt, um den Effekt zu zeigen. Alle Steuerelemente in ItemTemplate verhalten sich auf die gleiche Weise. –