net mvc example crear asp and asp.net user-controls webforms updatepanel .net-4.5

asp.net - mvc - Problema de Dynamic UpdatePanels y UserControls



security asp net mvc (2)

Solución

Tengo un trabajo para esto ahora. Estoy usando un UserControlLoader servidor UserControlLoader para envolver el control del usuario y representarlo por separado anulando RenderContents

El código para UserControlLoader es:

'''''' <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

Uso:

Para implementar esto en los pasos recreativos enumerados, el controlador de eventos btnGo se convierte en:

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

Se han encontrado con un problema interesante en ASP.Net WebForms al migrar un proyecto de 3.5 a 4.5.

El sitio en cuestión es extremadamente dinámico: la página está construida en base a la configuración en forma de CMS.

Sin embargo, en 4.5 tenemos un problema: cuando se agrega más contenido a la página mediante un clic de botón, no aparece todo el marcado del contenido. (En las pruebas, el problema se reproduce en .NET 4.0 también).

Para demostrarlo aquí hay un ejemplo muy depurado que solo usa la plantilla de proyecto predeterminada de WebForms (en VB en este caso).

En Default.aspx, agregue el siguiente marcado:

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

En Default.aspx.vb agregue el siguiente código:

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

Nota: Aquí hay un panel de ajuste entre el control del usuario y el panel de actualización. Esto sirve para demostrar qué marcado falta en la salida.

Crea un Control.ascx y agrega lo siguiente:

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

Una vez que haga clic en el control btnGo , el panel contenedor y control.ascx deben agregarse a la página.

En .Net 3.5 eso es exactamente lo que sucede:

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

En .Net 4.5, el panel de embalaje no aparece, solo el control del usuario:

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

El problema no ocurre si el panel de actualización está en el marcado de la página web, sin embargo, eso no es posible en este caso.

Alternar qué sobrecarga de LoadControl se usa (para LoadControl(type,params) produce el panel de envoltura, pero no el marcado; parece haber un problema aparte con esto).

La comprobación del cuerpo de respuesta en fiddler2 muestra que el panel de envoltura se omite en el lado del servidor (es decir, no lo estamos perdiendo en el procesamiento ajax del lado del cliente)

Entonces, ¿hay alguna solución, o incluso algún tipo de parche de corrección para este comportamiento? Parece ser una ruptura en .Net 4 dado que estaba bien en 3.5.

Ahora también he publicado esto en mi blog aquí para recopilar cualquier intento que haga para obtener una solución o una solución alternativa.

Actualizar

Siguiendo un puntero de @ jadarnel27 que los pasos a continuación no reprodujeron el problema en VS2010, probé los pasos en un par de máquinas fuera del trabajo.

  • Primero de otra máquina VS2013: recreó el problema.
  • A continuación, mi vieja máquina dev, ejecutando VS2012 Express For Web: no reprodujo el problema

Por lo tanto, se ve en esta etapa, ya que el problema está restringido a VS2013. Junto a probar algunas configuraciones diferentes en VS2013.

Ahora he publicado esto en Microsoft Connect aquí .


En mi caso, tuve el mismo problema al usar VS2013 Professional sin actualizaciones aplicadas. Supuse que era un error relacionado con el servidor de aplicaciones incrustadas que se incluye con la instalación (IIS Express). Actualizando IDE con el último paquete de actualización (VS2013 Actualización 5), ¡el problema desapareció!