Tôi đang có những gì tôi tin là một vấn đề khá đơn giản, nhưng đối với cuộc sống của tôi, tôi không thể thấy được vấn đề của mình. Vấn đề có liên quan đến ScriptManager.RegisterStartupScript, một cái gì đó tôi đã sử dụng nhiều lần trước đây.Không thể lấy ScriptManager.RegisterStartupScript trong WebControl lồng trong UpdatePanel để làm việc
Kịch bản tôi có là tôi có một điều khiển web tùy chỉnh đã được chèn vào một trang. Kiểm soát (và một hoặc hai người khác) được lồng trong UpdatePanel. Chúng được chèn vào trang vào PlaceHolder:
<asp:UpdatePanel ID="pnlAjax" runat="server">
<ContentTemplate>
<asp:PlaceHolder ID="placeholder" runat="server">
</asp:PlaceHolder>
...
protected override void OnInit(EventArgs e){
placeholder.Controls.Add(Factory.CreateControl());
base.OnInit(e);
}
Đây là bảng cập nhật duy nhất trên trang.
Kiểm soát yêu cầu một số javascript ban đầu được chạy để hoạt động chính xác. Các cuộc gọi kiểm soát:
ScriptManager.RegisterStartupScript(this, GetType(),
Guid.NewGuid().ToString(), script, true);
và tôi cũng đã cố gắng:
ScriptManager.RegisterStartupScript(Page, Page.GetType(),
Guid.NewGuid().ToString(), script, true);
Vấn đề là kịch bản chạy một cách chính xác khi trang được hiển thị đầu tiên, nhưng không chạy lại sau khi một postback một phần. Tôi đã thử những điều sau đây:
- Calling RegisterStartupScript từ CreateChildControls
- Calling RegisterStartupScript từ onload/OnPreRender
- Sử dụng kết hợp khác nhau của các tham số cho hai tham số đầu tiên (trong ví dụ trên Control là Page và Type là GetType(), nhưng tôi đã thử bằng cách sử dụng kiểm soát chính nó, vv).
- Tôi đã thử sử dụng id liên tục và mới (không phải là tôi tin rằng điều này sẽ có tác động lớn theo một trong hai cách).
- Tôi đã sử dụng một vài điểm ngắt và do đó đã xác minh rằng dòng Đăng ký đang được gọi chính xác.
Điều duy nhất tôi chưa thử là sử dụng UpdatePanel như Kiểm soát và Loại, vì tôi không tin rằng điều khiển nên nhận biết bảng điều khiển cập nhật (và trong mọi trường hợp có vẻ không phải là cách tốt để nhận bảng cập nhật?).
Có ai có thể thấy những gì tôi có thể làm sai ở trên không?
Cảm ơn :)
Vâng, để trả lời các truy vấn trên - nó xuất hiện như là nếu giữ chỗ bằng cách nào đó messes lên ScriptManager.RegisterStartupScript.
Khi tôi kéo điều khiển ra khỏi trình giữ chỗ và mã trực tiếp lên trang, tập lệnh Đăng ký hoạt động chính xác (tôi cũng đang sử dụng điều khiển chính nó làm tham số).
ScriptManager.RegisterStartupScript(this, GetType(), Guid.NewGuid().ToString(), script, true);
Ai có thể ném bất kỳ ánh sáng nào vào lý do tại sao điều khiển được tiêm vào PlaceHolder sẽ ngăn ScriptManager đăng ký đúng kịch bản không? Tôi đoán điều này có thể có một cái gì đó để làm với vòng đời của điều khiển năng động, nhưng sẽ đánh giá cao (cho kiến thức của riêng tôi) nếu có một quá trình chính xác cho các bên trên.
Hi Ben, cảm ơn câu trả lời. Tại thời điểm này, kịch bản chỉ đơn giản là kích hoạt một cảnh báo, không có gì hơn. Nó là một điều khiển lưới, kế thừa datagrid. Tôi thường sử dụng Firefox/Bug, nhưng trong trường hợp này tôi đang làm việc trong một ứng dụng chỉ có IE (không phải lựa chọn của tôi), sẽ không thể truy cập vào màn hình trong FF. Sử dụng thanh công cụ IE Dev, tôi có thể kiểm tra trang, nhưng kịch bản đã không đăng ký lại trên postback. Tôi thích ý tưởng của PageRequestManager, mặc dù kịch bản không dễ tiếp xúc với trang để gọi như một trình xử lý.Tôi thích những ý tưởng tho, và sẽ sử dụng những điều này để điều tra thêm, nhờ – Chris