2009-11-23 11 views
8

이것은 불합리한 공통 문제이며 모든 명백한 솔루션을 다 써 버렸기 때문에 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; 
    } 
} 

그래서 그냥 그 사실을 무시하십시오.

답변

2

Itemtemplate에 td-tag가 없거나 DOM이 올바르지 않을 때 updatapanel이 이상한 일을하는 경우가 있습니다.

+0

잘 잡았지만 실제로는 무시해도됩니다. 내가 보여주는 마크 업은 프로덕션 코드와 동일하지 않습니다. 나는 그 효과를 보여주기 위해 을 만들었습니다. ItemTemplate 내의 모든 컨트롤은 동일한 방식으로 동작합니다. –

3

편집 된 코드에 잔여 물이 있습니다. CommandArgumentCommandName 속성; 실제로 Repeater.ItemCommand 이벤트를 처리하고 있습니까?

그렇다면 페이지가 포스트 백에서 컨트롤의 Fill 메서드를 호출하면 설명 할 수 있습니다. A Stumper of an ASP.NET QuestionA Stumper of an ASP.NET Question: SOLVED!

설명은 조금 압도적이지만, 그것의 핵심은 Repeater.DataBind가 ASP.NET의 능력을 방해한다는 것입니다 :

이 고전 ASP.NET 헤어 찢어 문제는이 글에서 설명 어떤 리피터 버튼이 포스트 백을 야기했는지 결정하십시오.

+0

CommandArgument 및 CommandName 인수를 사용하고 있지만 Repeater.ItemCommand를 통해 이벤트를 버블 링하지는 않습니다. 표준 버튼 클릭 이벤트에서 액세스하는 정보를 저장하는 속성을 사용하고 있습니다. –

+0

나는 링크가 http://scottonwriting.net/sowBlog/archive/0000/00/00/162929.aspx이어야한다고 생각한다. – darasd

+0

@darasd - 링크 수정에 감사드립니다! –

2

DataBind()가 호출되어서는 안되기 때문에이 문제가 발생하는 때가 거의 언제나 있습니다. 그러면 중계기 내부의 컨트롤에서 대부분의 이벤트가 제거됩니다. 나는 당신이 Page_Load에 IsPostBack 체크를 가지고 있다는 것을 알기 때문에 시작이다. 그러나 repNotes.DataBind()에 중단 점을 넣고 예상하지 않을 때 호출되는지 확인하십시오.

UpdatePanel 밖에서도 제대로 작동합니까?

+0

DataBind()는 초기 페이지로드 및 지정된 컨트롤 이벤트 이후에만 호출됩니다. 아무 것도 발사되지 않습니다. UpdatePanel은 문제와 관련이없는 것처럼 보입니다. 나는 애플 리케이션에 또 다른 폼을 가지고있다.이 폼은 리피터 자체가 여기에있는 것처럼 스스로를 다시 게시 할 때 비슷한 행동을 보이고있다. 아주 이상한 행동. –

+0

이러한 컨트롤에 대해 ViewState를 비활성화하지 않았습니까? 당신은 "다른 형태"를 가지고 있습니다. 나는 그것이 다른 .aspx 페이지라는 것을 가정합니다. 이 페이지에 추가 양식 태그가 없습니까? – Bryan

+0

Bryan의 코멘트는 저에게 도움이되었습니다 : 제 경우에는 EnableViewState = "false"를 부모 리피터에 가지고 있었기 때문에 바닥 글 컨트롤의 포스트 백 핸들러가 실행되지 않았습니다. – fortboise

0

동일한 문제가 발생했습니다. DataBind를 두 번 실행하면 나에게 일어난 일입니다. 즉, 리피터 컨트롤을 두 번 (어떤 이유로 든) 채우면 이벤트가 발생하지 않습니다.

도움이 되었기를 바랍니다.

0

이 문제도 발생했습니다. 리피터를 리바 인딩하지 않았기 때문에 미친 듯이 움직였다. 동적으로 이벤트 핸들러를 추가하고, 뷰 스테이트 설정을 변경했다. 아무 효과가 없었다.

제 경우의 대답은 % # MyVar %> 구문을 사용하여 페이지에 바인딩 된 일부 코드 숨김 변수를 처리하기 위해 마스터 페이지에서 "Page.DataBind()"를 호출하는 것이 었습니다.

일단 Page.DataBind()가 작동하면 마스터 페이지를 다시 코딩하여 다른 방식으로 데이터를 가져와야합니다.

DataBind()를 페이지, 사용자 정의 컨트롤, 페이지 기본 클래스, 마스터 페이지 등의 체인을 연결하는 곳이라면 추측하겠습니다. 뷰 상태와 이벤트 버블 링이 발생할 수 있습니다.