2009-12-16 15 views
8

He leído a través de la red pero no he encontrado una solución al siguiente problema. Tengo esta página de ejemplo (_ScriptManager.aspx) con un ScriptManager, un UpdatePanel, un MultiView con dos Views y dos LinkButtons dos cambian entre las vistas. La segunda vista contiene algunas funciones para las que quiero cargar un archivo JavaScript (_ScriptManager.js).ScriptManager.RegisterClientScriptInclude no funciona en UpdatePanel

Dado que no sé si el usuario alguna vez visitará la vista 2, no quiero incluir el archivo javascript estáticamente en cada solicitud. Solo quiero cargarlo cuando lo necesite. Así que tengo que incluir el archivo de script durante una devolución de datos asíncrona, que es el que uso ScriptManager.RegisterClientScriptInclude para. El dolor es: no funciona. La secuencia de comandos include no se ejecuta de alguna manera en el cliente, por lo que las funciones de javascript no se pueden usar. Peor aún, ¡el bloque de script que registro en ScriptManager.RegisterStartupScript no se ejecuta en este caso! Esto es muy irritante. Lo interesante es que el script de inclusión y el bloque de script se envían al cliente con la devolución de datos asincrónica (Fiddler es mi amigo :-)) y también se carga el archivo de script. Pero luego, el javascript de alguna manera parece romper ...

¿Alguien tiene una pista o sabe de un error reportado?

_ScriptManager.aspx:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="_ScriptManager.aspx.cs" Inherits="Frontend.Web._Tests.ScriptManagerTest" %> 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 

<html xmlns="http://www.w3.org/1999/xhtml" > 
<head runat="server"> 
    <title></title> 
    <script src="http://ajax.microsoft.com/ajax/jQuery/jquery-1.3.2.min.js"></script> 
</head> 
<body> 
    <form id="form1" runat="server"> 
    <asp:ScriptManager runat="server" ID="scm"></asp:ScriptManager> 
    <asp:Label runat="server" ID="lbOut">Outside of UpdatePanel</asp:Label> 
    <div style="border: solid 1px red;"> 
     <asp:UpdatePanel runat="server" ID="up" UpdateMode="Conditional"> 
     <ContentTemplate> 
      <div> 
      <asp:LinkButton runat="server" ID="btnFirst">Show view 1</asp:LinkButton> 
      <asp:LinkButton runat="server" ID="btnSecond">Show view 2</asp:LinkButton> 
      </div> 
      <div> 
      <asp:MultiView runat="server" ID="mv"> 
       <asp:View runat="server" ID="vw1">First view - static content</asp:View> 
       <asp:View runat="server" ID="vw2"> 
       Second view - dynamically loaded content (between dashes): 
       <div>#<span id="divDyn"></span>#</div> 
       </asp:View> 
      </asp:MultiView> 
      </div> 
     </ContentTemplate> 
     </asp:UpdatePanel> 
    </div> 
    </form> 
</body> 
</html> 

_ScriptManager.js (aquí sólo tienes que añadir contenido dinámico al rango de medición con id = divDyn):

function dynamic() { 
    alert('dynamic'); 
    $('#divDyn').text('Dynamic!'); 
} 

_ScriptManager.aspx .cs código-detrás:

public partial class ScriptManagerTest : System.Web.UI.Page 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     btnFirst.Click += delegate { mv.SetActiveView(vw1); }; 
     btnSecond.Click += delegate { mv.SetActiveView(vw2); }; 

     if (!IsPostBack) 
     { 
      // Test 1: does not work 
      mv.SetActiveView(vw1); 

      // Test 2: works, because required script is loaded on initial page request 
      //mv.SetActiveView(vw2); 
     } 
    } 

    protected override void OnPreRender(EventArgs e) 
    { 
     base.OnPreRender(e); 

     if (mv.GetActiveView() == vw2) 
     { 
      // Not calling the RegisterClientScriptInclude 
      // makes the alert work in both cases, but this is 
      // what it's all about: including script only when 
      // needed! 
      ScriptManager.RegisterClientScriptInclude(
       Page, Page.GetType(), "include-js", 
       ResolveClientUrl("~/ScriptManager.js")); 
      ScriptManager.RegisterStartupScript(
       this, GetType(), "call-dynamic", 
       "alert('hi there'); dynamic();", true);  
     } 
    } 
} 

Respuesta

10

Bueno, esto es demoledor: después de dos sesiones de 2h de investigar el problema, probando TODAS las posibilidades del ScriptManager, tratando de usar jQuery y finalmente escribiendo esta muestra (porque la configuración del mundo real es como siempre más complicada)), ahora me encontré this short blog post que resuelve mi problema - con una sola línea añadida al archivo js incluye:

_ScriptManager.js:

function dynamic() { 
    alert('dynamic'); 
    $('#divDyn').text('Dynamic!'); 
} 
// notify that the script has been loaded <-- new! 
if (typeof (Sys) !== 'undefined') Sys.Application.notifyScriptLoaded(); 

Bueno, tal vez esto va a ser de alguna utilidad para cualquier persona más allá ...

Cuestiones relacionadas