ScriptManager. RegisterClientScriptInclude не работает в UpdatePanel

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

Так как я не знаю, будет ли пользователь когда-либо посещать представление 2, я не хочу включать файл JavaScript статически в для каждого запроса. Я только хочу загрузить его, если и когда мне нужен он. Таким образом, я должен включать файл сценария во время асинхронной обратной передачи, которая является тем, что я использую ScriptManager.RegisterClientScriptInclude для. Боль: это не работает. Сценарий включает, так или иначе не выполняется на клиенте так, чтобы JavaScript функционировал, внутри не может использоваться. Еще хуже, блок сценария я регистрируюсь в ScriptManager.RegisterStartupScript не становится выполняемым в этом случае! Это является все очень раздражающим. Интересная вещь состоит в том, что включать сценарий и блок сценария действительно становятся отправленными клиенту с асинхронной обратной передачей (Скрипач является моим другом :-)) и файл сценария также загружается. Но затем 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);    
        }
    }
}
8
задан Oliver 16 December 2009 в 18:20
поделиться

1 ответ

Что ж, это потрясающе: после двух двухчасовых сеансов исследования проблемы, попытки использования ВСЕХ возможностей ScriptManager, попытки использовать вместо этого jQuery и, наконец, написание этого образца (потому что реальный настройка мира, как всегда, более сложна), теперь я нашел это короткое сообщение в блоге , которое решает мою проблему - с единственной строкой, добавленной к включенному файлу 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();

Что ж, может быть, это будет полезно для кого-нибудь еще ...

10
ответ дан 5 December 2019 в 17:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: