2009-05-22 37 views
6

Tôi biết tôi có thể móc vào các sự kiện phía máy khách để chạy JavaScript sau mỗi lần đăng một phần; Tuy nhiên, tôi muốn làm một cái gì đó như thế này:Làm thế nào để kiểm soát JavaScript được chạy sau khi UpdatePanel một phần postback endRequest?

protected void FooClicked(object sender, EventArgs e) { 
     ClientScript.RegisterStartupScript(GetType(), "msg", "showMsg('Foo clicked');",true);   
} 

Tôi biết tôi hoàn toàn có thể hack nó với các lĩnh vực ẩn và chạy một cái gì đó sau khi mỗi postback, nhưng có phải là một cách khá straightfoward để trong một thời trang tương tự như điều này.

Trả lời

9

Mẫu mã cụ thể mà bạn mô tả không hoạt động với một phần sau lưng, vì ClientScript.RegisterStartupScript() viết JS cho trang trong giai đoạn xây dựng đầu ra của vòng đời yêu cầu; trong khi một phần postback chỉ cập nhật một phần được chọn của trang thông qua JavaScript (mặc dù đánh dấu cho toàn bộ trang, bao gồm cả tập lệnh khởi động của bạn, được tạo trên máy chủ).

Để bắt chước chặt chẽ những gì bạn mô tả, bạn nên bao gồm một điều khiển Literal bên trong UpdatePanel của bạn, và trong quá trình postback một phần thiết lập các Văn bản tài sản của bảng điều khiển nội dung kịch bản mà bạn muốn chạy:

myLiteral.Text = "<script type=\"JavaScript\">doStuff();</script>"; 

IMO, một cách thích hợp hơn là sử dụng các client-side API for async postbacks để đăng ký một xử lý sự kiện để chạy khi postback hoàn thành:

function endRequestHandler(sender, args) { 
    doStuff(); 
} 

Sys.WebForms.PageRequestManager.getInstance().add_endRequest(endRequestHandler); 

Nếu bạn cần phải vượt qua những thông tin được tạo ra trong quá postback vào xử lý, bạn có thể vượt qua mà thông qua các trường ẩn và lấy từ DOM trong trình xử lý phía máy khách của bạn.

+0

@Rex Tôi đã lên kế hoạch sử dụng các trường ẩn và trình xử lý sự kiện luôn có tệp, nhưng đang nhảy lên đó là một cơ chế tương tự như cơ chế tôi mô tả. Từ những gì tôi đã tìm thấy cho đến nay đây là lựa chọn duy nhất. – Mark

+0

@Rex Tôi đã viết lên cách tôi đã sử dụng phương pháp này để hoàn thành cùng một mục tiêu. http://fooberry.com/2009/05/25/running-specific-javascript-after-partial-postback/ – Mark

2

This thanh lịch hơn, IMO. dường như ASP AJAX sẽ gọi bất kỳ hàm JS nào có tên pageLoad. do đó, viết một hàm gọi là pageLoad và nó sẽ được thực hiện trên mọi tải trang, ngay cả sau khi cập nhật một phần.

1

<script type="text/javascript" language="javascript"> 
    function ValidateUserRole() { 
     var answer = confirm("Are you sure..................") 
     if (answer) { 
      var btnRoleReleatedButton = '<%=btnRoleReleatedButton.ClientID%>'; 
      document.getElementById(btnRoleReleatedButton).click(); 
     } 
     else { 
      return false; 
     } 
    } 
</script> 

Tier 3 :<asp:UpdatePanel ID="upTier3Details" runat="server" UpdateMode="Conditional"> 
    <ContentTemplate> 
     <asp:DropDownList ID="ddlTier3" runat="server" CssClass="ddlextralarge" Width="350" /> 
    </ContentTemplate> 
    <Triggers> 
     <asp:AsyncPostBackTrigger ControlID="ddlUserRole" EventName="SelectedIndexChanged" /> 
    </Triggers> 
</asp:UpdatePanel> 

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