2009-12-16 10 views
8

içinde çalışmaz Ağ üzerinden okudum, ancak aşağıdaki soruna bir çözüm bulamadım. ScriptManager, UpdatePanel, MultiView iki Views ve iki LinkButtons görüntü arasında iki geçiş ile bu örnek sayfa (_ScriptManager.aspx) var. İkinci görünümde (_ScriptManager.js) için bir JavaScript dosyası yüklemek istediğim bazı işlevler var.ScriptManager.RegisterClientScriptInclude, UpdatePanel

Kullanıcının 2 kez ziyaret edip etmeyeceğini bilmediğimden, her istek için javascript dosyasını statik olarak eklemek istemiyorum. İhtiyacım olduğunda sadece yüklemek istiyorum. Bu nedenle, script dosyasını ScriptManager.RegisterClientScriptInclude için kullandığım asenkronize bir geri gönderme sırasında eklemem gerekiyor. Acı: işe yaramıyor. Komut dosyası, istemcide bir şekilde yürütülmemiştir, böylece içerideki javascript işlevleri kullanılamaz. Daha da kötüsü, ben ScriptManager.RegisterStartupScript kayıt defterine blok bu durumda idam edilmez! Hepsi çok rahatsız edici. İlginç olan, içerme komut dosyasının ve komut dosyası bloğunun istemciye gönderilmesini (asılsız gönderim) (Fiddler benim arkadaşım :-)) ve betik dosyasının da yüklenmesidir. Ama sonra javascript bir şekilde kırılıyor gibi görünüyor ...

Herhangi bir kimse bir ipucu veya bildirilen bir hatayı biliyor mu?

_ScriptManager.aspx:

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

_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 (burada ben sadece id = divDyn ile span bazı dinamik içerik eklemek) .cs kod arkasında:

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

cevap

10

Peki, bu yıkıcıdır: Sorunu araştıran 2 saatlik 2 seanstan sonra, ScriptManager'ın tüm olasılıklarını kullanın, bunun yerine jQuery'yi kullanmaya çalışın ve nihayet bu örneği yazın (çünkü gerçek dünya kurulumu her zaman daha karmaşıktır)), ben artık sorunu çözer this short blog post bulundu - js dosyasına eklenen tek bir satır ile birlikte:

_ScriptManager.js:

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

belki de bu herkes için herhangi bir kullanım olacak dışarıda başka ...

İlgili konular