2009-12-16 28 views
8

Tôi đã đọc qua mạng nhưng chưa tìm thấy giải pháp cho vấn đề sau. Tôi có trang ví dụ này (_ScriptManager.aspx) với ScriptManager, một UpdatePanel, một MultiView với hai Views và hai LinkButtons hai chuyển đổi giữa các chế độ xem. Chế độ xem thứ hai chứa một số chức năng mà tôi muốn tải tệp JavaScript cho (_ScriptManager.js).ScriptManager.RegisterClientScriptInclude không hoạt động trong UpdatePanel

Vì tôi không biết liệu người dùng có bao giờ truy cập chế độ xem 2 không tôi muốn bao gồm tệp javascript tĩnh cho mọi yêu cầu. Tôi chỉ muốn tải nó nếu và khi tôi cần nó. Vì vậy, tôi cần phải bao gồm các tập tin kịch bản trong một postback không đồng bộ đó là những gì tôi sử dụng ScriptManager.RegisterClientScriptInclude cho. Cơn đau là: nó không hoạt động. Kịch bản bao gồm bằng cách nào đó không được thực hiện trên máy khách để các hàm javascript bên trong không thể được sử dụng. Thậm chí tệ hơn, khối script tôi đăng ký trong ScriptManager.RegisterStartupScript không được thực hiện trong trường hợp này! Đây là tất cả rất khó chịu. Điều thú vị là kịch bản lệnh bao gồm và khối tập lệnh được gửi đến máy khách với postback không đồng bộ (Fiddler là bạn của tôi :-)) và tệp kịch bản lệnh cũng được tải. Nhưng sau đó javascript bằng cách nào đó dường như phá vỡ ...

Có ai có một đầu mối hoặc biết một lỗi được báo cáo?

_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 (ở đây tôi chỉ cần thêm một số nội dung động đến khoảng với id = divDyn):

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

_ScriptManager.aspx .cs mã-đằng sau:

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

Trả lời

10

Vâng, đây là sự tan vỡ: sau hai phiên điều tra vấn đề, hãy thử tất cả các khả năng của ScriptManager, cố gắng sử dụng jQuery và cuối cùng viết mẫu này (vì thiết lập thế giới thực luôn phức tạp hơn), bây giờ tôi thấy this short blog post mà giải quyết vấn đề của tôi - với một dòng duy nhất bổ sung vào tập tin js bao gồm:

_ScriptManager.js:

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

Vâng, có lẽ đây sẽ là của bất kỳ sử dụng cho bất cứ ai ngoài kia ...

Các vấn đề liên quan