이것은 불합리한 공통 문제이며 모든 명백한 솔루션을 다 써 버렸기 때문에 SOC가 나에게 일부 입력을 제공 할 수 있기를 바라고 있습니다. 다음을 포함하는 페이지 안에 UserControl이 있습니다. 중계기가 포스트 백을 일으키는 여러 컨트롤을 하우징합니다. 문제는 리피터 내부의 모든 컨트롤이 포스트 백 (postback) 될 때 이벤트 핸들러에 절대 도달하지 않지만 리피터 외부의 컨트롤 (여전히 UC에 있음)이 올바르게 처리된다는 것입니다. 난 이미 내 컨트롤이 누락되었습니다 if(!IsPostBack)
으로 인해 재생성되지 않았 음을 확인하고 Request.Form [ "__ EVENTTARGET"]에 올바른 컨트롤 ID가 Page_Load 이벤트에 포함되어 있는지 확인했습니다. 나는 별도의 프로젝트에서 증상을 재현하려고 시도했는데 그것이해야하는대로 일했습니다. 이 코드는 의도적으로 기능이없는 ASP.NET 컨트롤 이벤트 리피터 내부에서 발생하지 않음
<%@ 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;
}
}
그래서 그냥 그 사실을 무시하십시오.
잘 잡았지만 실제로는 무시해도됩니다. 내가 보여주는 마크 업은 프로덕션 코드와 동일하지 않습니다. 나는 그 효과를 보여주기 위해을 만들었습니다. ItemTemplate 내의 모든 컨트롤은 동일한 방식으로 동작합니다. –