2009-12-16 10 views
8

Ho letto la rete ma non ho trovato una soluzione al seguente problema. Ho questa pagina di esempio (_ScriptManager.aspx) con uno ScriptManager, uno UpdatePanel, uno MultiView con due Views e due LinkButtons due switch tra le visualizzazioni. La seconda vista contiene alcune funzionalità che voglio caricare un file JavaScript per (_ScriptManager.js).ScriptManager.RegisterClientScriptInclude non funziona in UpdatePanel

Poiché non so se l'utente visualizzerà mai la vista 2, non desidero includere il file javascript in modo statico per ogni richiesta. Voglio solo caricarlo se e quando ne ho bisogno. Quindi ho bisogno di includere il file di script durante un postback asincrono che è quello che uso per ScriptManager.RegisterClientScriptInclude. Il dolore è: non funziona. Lo script include è in qualche modo non eseguito sul client in modo che le funzioni javascript all'interno non possano essere utilizzate. Ancora peggio, il blocco di script che registro in ScriptManager.RegisterStartupScript non viene eseguito in questo caso! Questo è tutto molto irritante. La cosa interessante è che lo script di inclusione e il blocco di script vengono inviati al client con il postback asincrono (Fiddler è il mio amico :-)) e viene caricato anche il file di script. Ma poi il javascript sembra in qualche modo rompersi ...

Qualcuno ha un indizio o sa di un bug segnalato?

_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 (qui solo aggiungere alcuni contenuti dinamici a campata con id = divDyn):

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

_ScriptManager.aspx .cs code-behind:

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);  
     } 
    } 
} 

risposta

10

Bene, questo è sconvolgente: dopo due sessioni di 2 ore di investigazione del problema, provando TUTTE le possibilità di ScriptManager, provando a usare jQuery e infine scrivendo questo esempio (perché la configurazione del mondo reale è come sempre più complicata), ho trovato ora this short blog post che risolve il mio problema - con una sola riga aggiunta al file js incluso:

_ScriptManager.js:

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

beh, forse questo sarà di qualche utilità per chiunque altrimenti fuori là ...

Problemi correlati