2009-05-10 36 views
6

Tôi biết điều này đã được yêu cầu trước đó, nhưng tôi đã tìm thấy một cách khác nhau để có được tham chiếu đến các điều khiển trong các tệp JS bên ngoài nhưng tôi không chắc chắn làm thế nào điều này sẽ đi xuống về tốc độ tổng thể.Có cách nào tốt hơn để đưa ClientID vào các tệp JS bên ngoài không?

Mã của tôi là

public static void GenerateClientIDs(Page page, params WebControl[] controls) { 

     StringBuilder script = new StringBuilder(); 
     script.AppendLine("<script type=\"text/javascript\">"); 

     foreach (WebControl c in controls) { 
      script.AppendLine(String.Format("var {0} = '#{1}';", c.ID, c.ClientID)); 
     } 

     script.AppendLine("</script>"); 

     if (!page.ClientScript.IsClientScriptBlockRegistered("Vars")) { 
      page.ClientScript.RegisterClientScriptBlock(page.GetType(), "Vars", script.ToString()); 
     } 
    } 

Đây là tôi có thể tham khảo các id của trang aspx trong các tập tin JS của tôi.

Có ai có thể thấy bất kỳ hạn chế nào để thực hiện công việc theo cách này không? Tôi chỉ mới bắt đầu sử dụng các tệp JS bên ngoài. Trước khi mọi thứ được viết vào chính UserControl.

+0

Đó trông thật sự theo ý kiến ​​của tôi – ichiban

+1

Hãy chắc chắn rằng thẻ các yếu tố kịch bản của đang không ở trong bạn tệp .js - đó là HTML, không phải Javascript. – Anonymous

+0

có, mã được tạo sẽ đi vào đầu ra HTML –

Trả lời

1

Vâng, phương pháp chỉ có thể được sử dụng một lần trong mỗi trang, vì vậy nếu bạn đang gọi nó từ điều khiển người dùng có nghĩa là bạn không bao giờ có thể đặt hai điều khiển người dùng trên cùng một trang.

Bạn có thể lưu trữ các tham chiếu điều khiển trong danh sách cho đến khi sự kiện PreRender, sau đó đặt tất cả chúng vào một thẻ tập lệnh trong đầu trang. Bằng cách đó bạn có thể gọi phương thức nhiều lần và tất cả các ID khách hàng được đặt trong cùng một thẻ tập lệnh.

Cái gì như:

private const string _key = "ClientIDs"; 

public static void GenerateClientIDs(params WebControl[] controls) { 
    Page page = HttpContext.Current.Handler As Page; 
    List<WebControl> items = HttpContext.Current.Items[_key] as List<WebControl>; 

    if (items == null) { 
     page.PreRender += RenderClientIDs; 
     items = new List<WebControl>(); 
    } 

    items.AddRange(controls); 

    HttpContext.Current.Items[_key] = items; 
} 

private static void RenderClientIDs() { 
    Page page = HttpContext.Current.Handler As Page; 
    List<WebControl> items = HttpContext.Current.Items[_key] as List<WebControl>; 

    StringBuilder script = new StringBuilder(); 
    script.AppendLine("<script type=\"text/javascript\">"); 
    foreach (WebControl c in items) { 
     script.AppendLine(String.Format("var {0} = '#{1}';", c.ID, c.ClientID)); 
    } 
    script.AppendLine("</script>"); 

    page.Head.Controls.Add(new LiteralControl(script)); 
} 
+0

Rất đẹp. Cảm ơn :-) –

1

Kiểm tra này ra: http://weblogs.asp.net/joewrobel/archive/2008/02/19/clientid-problem-in-external-javascript-files-solved.aspx

Hình như nó sẽ chăm sóc của các công việc bẩn thỉu cho bạn (giống như câu trả lời của Guffa). Nó tạo ra một đối tượng JSON (example) chứa ID máy chủ và ID khách hàng, vì vậy bạn có thể làm một cái gì đó như thế này trong JavaScript:

var val = PageControls.txtUserName.value; 
Các vấn đề liên quan