2009-11-23 11 views
8

これは不合理な一般的な問題であり、明白な解決策をすべて使い果たしているので、私はSOが私にいくつかの入力を提供できると思っています...私はUserControlをポストバックを引き起こすいくつかのコントロールを収容するリピータ。問題は、リピータ内のすべてのコントロールが、ポストバック時にイベントハンドラにヒットすることはありませんが、リピータの外のコントロール(まだUC内にある)は正しく処理されています。私はすでにif(!IsPostBack)が見つからないためコントロールが再生成されていないことを確認し、Request.Form ["__ EVENTTARGET"]に正しいコントロールIDがPage_Loadイベントに含まれていることを確認しました。私は別のプロジェクトで症状を再現しようとしましたが、それはうまくいくはずでした。リピータ内で制御イベントが発生しない

<%@ 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

ブライアンのコメントは私の助けになりました。私のケースでは、親リピータでEnableViewState = "false"を設定していたため、フッターコントロールのポストバックハンドラが起動されませんでした。 – fortboise

0

同じ問題が発生しました。私がDataBindを2回実行した場合、私と一緒に起こった。言い換えれば、何らかの理由でリピータコントロールを2回入力すると、イベントは発生しません。

私は役立つことを願っています。

0

この問題も同様に発生しました。リピーターを再バインドしていなかったので私を夢中にしました。イベントハンドラーを動的に追加し、ビューステートの設定を変更しました。何も機能しませんでした。

私の場合は、<%#MyVar%>構文を使用してページにバインドされていたコードビヘイド変数を処理するために、マスターページで "Page.DataBind()"を呼び出していました。

Page.DataBind()が機能したら、マスターページを再コードして別の方法でデータを取り込む必要がありました。

あなたのページ、ユーザーコントロール、ページベースクラス、マスターページなどのチェーンのどこにでもDataBind()を実行しているとすれば、ビューステートとイベントのバブリングが終了する可能性があります。

関連する問題