2013-12-09 12 views
5

ASP.Net WebForms ilginç bir konuya rastladınız mı.Dinamik UpdatePanels ve UserControls sorunu

söz konusu site son derece dinamiktir - sayfa CMS moda yapılandırmasına göre inşa edilmiştir.

Ancak 4,5 yılında bir sorunumuz var - Daha fazla içerik bir düğme tıklaması sayesinde sayfaya eklendiğinde, içerik değil tüm biçimlendirme görünür. (Sorunun test edilmesi sırasında .net 4.0'da da üretilir). Burada göstermek için

sadece (bu durumda VB) varsayılan WebForms proje şablonu kullanan bir çok dışarı soyulmuş örnektir.

default.aspx olarak

şu işaretlemeyi ekleyin: Default.aspx.vb yılında

<asp:UpdatePanel ID="udpTrigger" runat="server" UpdateMode="Always"> 
    <ContentTemplate> 
     <asp:button id="btnGo" runat="server" Text ="Go" /> 
    </ContentTemplate> 
</asp:UpdatePanel> 
<asp:Panel ID="pnlContainer" runat="server"> 
</asp:Panel> 

aşağıdaki kodu ekleyin:

Dim _udp As UpdatePanel 

Private Sub Page_Init(sender As Object, e As EventArgs) Handles Me.Init  
    _udp = New UpdatePanel() 
    _udp.ID = "udpTarget" 
    _udp.UpdateMode = UpdatePanelUpdateMode.Conditional 

    pnlContainer.Controls.Add(_udp)   
End Sub 

Private Sub btnGo_Click(sender As Object, e As EventArgs) Handles btnGo.Click  
    Dim ctrl = LoadControl("Control.ascx")   

    Dim pnlWrapper = New Panel With {.ID = "pnlWrapper"} 
    pnlWrapper.Controls.Add(ctrl) 

    _udp.ContentTemplateContainer.Controls.Add(pnlWrapper)   
    _udp.Update()    
End Sub 

Not: Bir sarma paneli burada bulunmaktadır kullanıcı denetimi ve güncelleme paneli arasında. Bu, çıktıda hangi işaretlemenin eksik olduğunu gösterir.

bir Control.ascx oluşturun ve aşağıdakileri ekleyin:

<asp:Panel ID="pnlControl" runat="server"></asp:Panel> 

biz btnGo kontrolünü tıkladığınızda, sarıcı paneli ve Control.ascx sayfasına eklenmelidir. Sorun kokan

<div id="MainContent_pnlContainer">   
    <div id="MainContent_udpTarget"> 
     <div id="MainContent_ctl02_pnlControl"> 
     </div> 
    </div> 
</div> 

: - sadece kullanıcı kontrolü

<div id="pnlContainer">      
    <div id="udpTarget"> 
     <div id="pnlWrapper"> 
      <div id="ctl05_pnlControl"> 
      </div> 
     </div> 
    </div> 
</div> 

.Net 4.5, sargı paneli görünmüyor: olur tam olarak ne .Net 3.5'de

t güncelleme paneli web sayfasının işaretlemesinde ise, ancak bu durumda mümkün değildir oluşur. aşırı LoadControl

Anahtarlama (- bu ayrı bir sorun olduğu görülmektedir LoadControl(type,params) için sargı panelini üreten, ama hiçbir biçimlendirme) kullanılır. Fiddler2 yanıt gövdesini kontrol edilmesi

sarıcı paneli sunucu tarafında ihmal edildiğini gösterir (yani biz istemci tarafı ajax işleme kaybetme değiliz)

Yani herhangi bir geçici çözüm veya hatta çeşit var Bu davranış için düzeltme düzeltme eki - 3.5'de iyi olduğu göz önüne alındığında .Net 4'te bir kırılma gibi görünüyor.

da şimdi bir düzeltme veya geçici çözümü elde etmek için yapmak girişimlerini toplamak için benim blog here bu ilan mı. @ Jadarnel27 Aşağıdaki adımlar VS2010 sorunu yeniden etmediğini bir pointer ardından

Güncelleme

, ben işten uzak makinelerin bir çift adımları denedim.

  • İlk önce başka bir VS2013 makinesinde: Sorunu yeniden oluşturdunuz.
  • Sonraki, eski dev makinesi, Web için VS2012 Express çalıştıran: sorun VS2013 ile sınırlıdır gibi

Yani bu aşamada bakar sorunu yeniden vermedi. VS2013'te birkaç farklı ayarı denemek için.

Şimdi bunu Microsoft Connect here adresine gönderdiniz.

+0

Kontrol ağacını (sayfadan denetime bakarak, Denetimler özelliklerini kullanarak) incelemek, ağaçtaki panel midir yoksa orada değil mi? Sorun, sunucu tarafında mı yoksa ajax betiklerinde mi farkedilir. Bunu pre-render olayında kontrol etmelisiniz. – JotaBe

+0

@JotaBe: Geri gönderilen işaret sarmalayıcıyı içermez - kemancıda kontrol edilir, yanıt içeriğine bakar. –

+0

@ jadarnel27. İlginç. Burada tüm makinelerde var. Ev kurulumumu test edecek. –

cevap

1

Geçici çözüm

Şu an bunun için bir işim var. Ben kullanıcı kontrolünü sarmak ve UserControlLoader için RenderContents

kodu geçersiz kılarak bunu ayrı olarak işlemek için bir UserControlLoader sunucu denetimi kullanıyorum geçerli:

''' <summary> 
''' UserControl Loader - loads a user control 
''' Works around a problem with ASP.Net Webforms in 4.0/4.5 
''' </summary> 
<ToolboxData("<{0}:UserControlLoader runat=server></{0}:UserControlLoader>")> _ 
Public Class UserControlLoader 
    Inherits WebControl 

    Public ReadOnly Property Control As Control 
     Get 
      Return _control 
     End Get 
    End Property 
    Private _control As Control 

    Public Sub LoadControl(page As Page, virtualPath As String) 
     _control = page.LoadControl(virtualPath) 
     Me.Controls.Add(_control) 
    End Sub 

    Public Overrides Sub RenderBeginTag(writer As HtmlTextWriter) 
     'Don't render anything 
    End Sub 

    Public Overrides Sub RenderEndTag(writer As HtmlTextWriter) 
     'Don't render anything 
    End Sub 

    ''' <summary> 
    ''' Overrides RenderContent to write the content to a separate writer, 
    ''' then adds the rendered markup into the main HtmlTextWriter instance. 
    ''' </summary> 
    Protected Overrides Sub RenderContents(ByVal writer As HtmlTextWriter) 

     If _control Is Nothing Then Return 

     Using sw = New StringWriter() 
      Using hw = New HtmlTextWriter(sw) 

       MyBase.RenderContents(hw) 

       writer.Write(sw.ToString) 

      End Using 
     End Using 

    End Sub 

End Class 

Kullanımı:

rekreasyon içine Bunu uygulamak için listelenen adımlar, btnGo olay işleyicisi haline gelir: benim durumumda

Private Sub btnGo_Click(sender As Object, e As EventArgs) Handles btnGo.Click 

    Dim loader = new UserControlLoader() 
    loader.LoadControl(Page,"Control.ascx")  

    Dim pnlWrapper = New Panel With {.ID = "pnlWrapper"} 
    pnlWrapper.Controls.Add(loader) 

    _udp.ContentTemplateContainer.Controls.Add(pnlWrapper)   
    _udp.Update() 

End Sub 
0

, ben güncellemeler uygulanmadan VS2013 Professional kullanarak aynı sorunu vardı. Instalation (IIS Express) ile birlikte gelen gömülü uygulama sunucusu ile ilgili bir hata olduğunu varsayalım. Son güncelleme paketiyle (VS2013 Güncelleme 5) IDE güncellenirken, sorun ortadan kalktı!