2009-12-16 5 views
8

Я прочитал сеть, но не нашел решение следующей проблемы. У меня есть эта страница примера (_ScriptManager.aspx) с ScriptManager, UpdatePanel, MultiView с двумя Views и двумя двумя переключателями между видами. Второе представление содержит некоторые функции, которые я хочу загрузить файл JavaScript для (_ScriptManager.js).ScriptManager.RegisterClientScriptInclude не работает в UpdatePanel

Поскольку я не знаю, будет ли пользователь когда-либо посещать представление 2, я не хочу включать статический файл javascript для каждого запроса. Я только хочу загрузить его, если и когда мне это нужно. Поэтому мне нужно включить файл сценария во время асинхронной обратной передачи, для которой я использую ScriptManager.RegisterClientScriptInclude. Боль такова: она не работает. Скрипт как-то не выполняется на клиенте, так что функции javascript внутри не могут быть использованы. Хуже того, блок сценария, который я регистрирую в ScriptManager.RegisterStartupScript, не выполняется в этом случае! Это очень раздражает. Интересно, что скрипт include и блок сценария отправляются клиенту с обратной записью async (Fiddler - мой друг :-)), и файл сценария также загружается. Но тогда javascript каким-то образом, кажется, сломается ...

У кого-нибудь есть подсказка или информация об ошибке?

_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 (здесь я просто добавить динамическое содержимое в пролете с ID = divDyn):

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

_ScriptManager.aspx .cs код-сзади:

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

ответ

10

Ну, это разрушительно: после двух 2-х сеансов исследования проблемы, пытаясь использовать все возможности ScriptManager, вместо этого пытаться использовать jQuery и, наконец, написать этот образец (поскольку установка в реальном мире, как всегда, сложнее), теперь я нашел this short blog post, который решает мою проблему - с одной строки добавляется в файл JS включены:

_ScriptManager.js:

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

Ну, может быть, это будет никакой пользы для тех, еще там ...

Смежные вопросы