2009-11-23 10 views
8

यह एक बेहद आम मुद्दा है और सभी स्पष्ट समाधानों को समाप्त कर दिया है, मुझे उम्मीद है कि एसओ मुझे कुछ इनपुट दे सकता है ... मेरे पास एक पृष्ठ के अंदर UserControl है एक दोहराना आवास कई नियंत्रण जो पोस्टबैक का कारण बनता है। समस्या यह है कि पुनरावर्तक के अंदर के सभी नियंत्रण कभी भी अपने ईवेंट हैंडलर को पोस्टबैक नहीं करते हैं, लेकिन पुनरावर्तक (अभी भी यूसी में) के बाहर नियंत्रण सही ढंग से संभाले जाते हैं। मैंने पहले से ही सुनिश्चित किया है कि if(!IsPostBack) गुम होने के कारण मेरे नियंत्रण पुन: उत्पन्न नहीं किए जा रहे थे और मैंने सत्यापित किया कि Request.Form ["__ EVENTTARGET"] में पृष्ठ_लोड ईवेंट में सही नियंत्रण आईडी शामिल है। मैंने एक अलग परियोजना में लक्षणों का पुनरुत्पादन करने का प्रयास किया और यह काम करता था जैसा कि इसे करना चाहिए।एएसपी.नेट - नियंत्रण घटनाएं पुनरावर्तक के अंदर फायरिंग नहीं

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

मुझे आइटमटेम्प्लेट में एक लापता टीडी टैग मिला, कभी-कभी जब डोम गलत होता है, तो अपडेटटापनेल अजीब चीजें करता है।

+0

अच्छी पकड़, लेकिन आप वास्तव में उस पर ध्यान दे सकते हैं। मैं जो मार्कअप दिखा रहा हूं वह उत्पादन कोड के समान नहीं है। मैंने उस प्रभाव को दिखाने के लिए बनाया है। ItemTemplate के अंदर सभी नियंत्रण एक ही तरीके से व्यवहार करते हैं। –

3

आपके संपादित कोड में अवशिष्ट CommandArgument और CommandName गुण हैं; क्या आप वास्तव में Repeater.ItemCommand ईवेंट को संभालने वाले हैं?

यदि ऐसा है, और यदि आपका पृष्ठ पोस्टबैक पर नियंत्रण की Fill विधि को कॉल करता है, तो यह समझाएगा।

इस क्लासिक ASP.NET बाल-फाड़ समस्या इन पदों में समझाया गया है: A Stumper of an ASP.NET Question और A Stumper of an ASP.NET Question: SOLVED!

विवरण एक छोटे से दिमाग झुकने है, लेकिन यह की जड़ है कि Repeater.DataBind को ASP.NET के क्षमता में हस्तक्षेप करते है निर्धारित करें कि कौन से दोहराने वाले बटन ने पोस्टबैक का कारण बना दिया।

+0

हालांकि मैं कमांडअर्ग्यूमेंट और कमांडनाम तर्क का उपयोग कर रहा हूं, लेकिन मैं रिपेटर.इटम कॉमांड के माध्यम से घटनाओं को बुलबुला नहीं कर रहा हूं। मैं उन सूचनाओं को संग्रहीत करने के लिए गुणों का उपयोग कर रहा हूं जिन्हें मैं मानक बटन क्लिक ईवेंट में एक्सेस करता हूं। –

+0

मुझे लगता है कि लिंक होना चाहिए http://scottonwriting.net/sowBlog/archive/0000/00/00/162929.aspx – darasd

+0

@dasasd - लिंक सुधार के लिए धन्यवाद! –

2

बस इस समस्या में भाग लेने के लगभग हर बार ऐसा इसलिए होता है क्योंकि डेटाबिंड() को तब नहीं कहा जा रहा है जब यह नहीं होना चाहिए। यह दोहराने के अंदर नियंत्रण से अधिकांश घटनाओं को मार देगा। मुझे लगता है कि आपके पास है! IsPostBack आपके पेज_लोड में जांचें ... तो यह एक शुरुआत है। लेकिन repNotes.DataBind() पर ब्रेकपॉइंट डालने का प्रयास करें और देखें कि जब आप इसकी अपेक्षा नहीं करते हैं तो इसे कॉल किया जा रहा है या नहीं।

क्या यह एक अपडेटपेनल के बाहर ठीक काम करता है?

+0

डेटाबिंड() केवल प्रारंभिक पृष्ठ लोड पर और निर्दिष्ट नियंत्रण घटनाओं के बाद कहा जा रहा है- इनमें से कोई भी नहीं किया जा रहा है जैसा कि उन्हें करना चाहिए। UpdatePanel समस्या से संबंधित प्रतीत नहीं होता है। मेरे ऐप में मेरा एक और रूप है जो काम करने के लिए भी प्रयोग किया जाता है जो समान व्यवहार का प्रदर्शन कर रहा है, जब फॉर्म दोहराने वाले पोस्ट को वापस पोस्ट करता है जैसा कि यह करता है। बहुत अजीब व्यवहार। –

+0

आपने इनमें से किसी भी नियंत्रण के लिए व्यूस्टेट अक्षम नहीं किया है? आपके पास "दूसरा फॉर्म" है ... मुझे लगता है कि यह एक अलग .aspx पृष्ठ पूरी तरह से है? आपके पास इस पृष्ठ में कोई अतिरिक्त फॉर्म टैग नहीं है? – Bryan

+0

ब्रायन की टिप्पणी ने मेरी मदद की: मेरे मामले में मैंने माता-पिता पुनरावर्तक पर EnableViewState = "false" किया था, और इससे पाद लेख नियंत्रण के पोस्टबैक हैंडलर को निकाल दिया गया था। – fortboise

0

मैं एक ही समस्या में भाग गया। यह मेरे साथ हुआ अगर मैंने डेटाबाइंड दो बार चलाया है। दूसरे शब्दों में जब मैं दोहराए जाने वाले नियंत्रण को दो बार (किसी भी कारण से) करता हूं तो घटनाएं आग लगती हैं।

मुझे उम्मीद है कि इससे मदद मिलती है।

0

मैं भी इस समस्या में भाग गया। मुझे पागल कर दिया क्योंकि मैं अपने दोहराने को पुनर्जीवित नहीं कर रहा था, मैंने गतिशील रूप से एक ईवेंट हैंडलर जोड़ने की कोशिश की, जगह पर दृश्य सेटिंग बदलना, कुछ भी काम नहीं किया।

मेरे मामले में जवाब यह था कि मैं <% # MyVar%> वाक्यविन्यास का उपयोग कर पृष्ठ पर बाध्य होने वाले कुछ कोडबेंड वैरिएबल को संभालने के लिए मास्टर पेज में "पेजटाटा()" को कॉल कर रहा था।

एक बार जब मैंने पृष्ठ निकाला। डेटाबाइंड() यह काम करता है, तो मुझे उस डेटा को अलग तरीके से खींचने के लिए मास्टर पेज को रिकोड करना पड़ा।

तो मुझे लगता है कि यदि आप डेटा पेज (उपयोगकर्ता नियंत्रण, पेज बेस क्लास, मास्टर पेज इत्यादि) के लिए कहीं भी डेटाबिंड() कर रहे हैं तो यह अनुमान लगा रहा है कि यह आपके व्यूस्टेट और इवेंट बबलिंग को मार सकता है।

संबंधित मुद्दे