2009-05-20 57 views
5

tôi là tạo ra một điều khiển kịch bản tùy chỉnh trong ASP.NETThêm một điều khiển vào tiêu đề trang trong ASP.NET

Mục đích của việc kiểm soát chỉ đơn giản là một biến thể máy chủ của thẻ, được sử dụng để tải các tập tin javascript Tuy nhiên, mục đích chính của điều khiển này là kết hợp nhiều tập lệnh thành một câu trả lời để phía khách hàng họ thấy thứ gì đó giống như thẻ cho mỗi vị trí, vì vậy tất cả các tập lệnh được đăng ký ở vị trí DocumentTop sẽ được kết hợp thành một thẻ với ngoại lệ vị trí "nội tuyến", tất cả các tập lệnh nội tuyến được hiển thị riêng lẻ, nơi chúng tồn tại trong đánh dấu Tôi cũng đã tạo một người gửi khiếu nại, js.ashx, kết hợp thực tế của tập lệnh

Tất cả mọi thứ đang làm việc tốt ngoại trừ "Head" vị trí, cho hai địa điểm tài liệu tôi chỉ đơn giản sử dụng ClientScriptManager trong PreRender nhưng đối với vị trí Trưởng phòng tôi đã thử đoạn mã sau trong thời gian trước làm

var scriptControl = new HtmlGenericControl("script"); 
scriptControl.Attributes["language"] = "javascript"; 
scriptControl.Attributes["type"] = "text/javascript"; 
scriptControl.Attributes["src"] = src; 
Page.Header.Controls.Add(scriptControl); 

và tôi nhận được lỗi sau: Không thể sửa đổi bộ sưu tập kiểm soát trong các giai đoạn DataBind, Init, Load, PreRender hoặc Unload.

có ai biết cách thêm điều khiển vào tiêu đề trang từ trong điều khiển tùy chỉnh không?

Ngẫu nhiên, điều khiển được sử dụng trên trang nội dung có hai bậc thầy lồng nhau và cũng có một ScriptManager được đăng ký trên thư mục gốc. dự án này là một dự án ứng dụng asp.net 3.5 web

Trả lời

8

Ive phát hiện ra một câu trả lời cho câu hỏi của tôi.

Tôi không hiểu tại sao nhưng vấn đề nằm ở khi tôi cố gắng thêm điều khiển tập lệnh vào đầu, thực hiện nó trong sự kiện PreRender của kiểm soát gây ra lỗi của tôi nhưng nếu bạn thêm điều khiển trong PreRender của trang sự kiện tất cả hoạt động tốt và dandy ví dụ:

protected override void OnInit(EventArgs e) 
{ 
    base.OnInit(e); 
    this.Page.PreRender += new EventHandler(Page_PreRender); 
} 

void Page_PreRender(object sender, EventArgs e) 
{ 
    var scriptControl = new HtmlGenericControl("script"); 
    Page.Header.Controls.Add(scriptControl); 
    scriptControl.Attributes["language"] = "javascript"; 
    scriptControl.Attributes["type"] = "text/javascript"; 
    scriptControl.Attributes["src"] = "blah.js"; 
} 
3

Tôi không biết lý do tại sao bạn nhận được lỗi này nhưng làm thế nào về việc sử dụng ClientScript như thế:

protected void Page_Load(object sender, EventArgs e) 
{ 
    string scriptFile = "myscriptFile.js"; 

    if (!this.Page.ClientScript.IsClientScriptIncludeRegistered("myScript")) 
    { 
     this.Page.ClientScript.RegisterClientScriptInclude("myScript", scriptFile); 
    } 
} 

ClientScriptManager.RegisterClientScriptInclude Method

+0

Hi Canavar tôi thành công bằng cách sử dụng Page.ClientScript đăng ký kịch bản trong cơ thể tài liệu, vấn đề là cố gắng để đăng ký một thẻ script trong thẻ , để kiến thức của tôi, this.Page.ClientScript.RegisterClientScriptInclude đăng ký các js ngay sau thẻ

trong nội dung – Lightweight

0
protected void Page_Load(object sender, EventArgs e) 
    {   
     HtmlGenericControl js = new HtmlGenericControl("script"); 
     js.Attributes["type"] = "text/javascript"; 
     js.Attributes["src"] = yol.ScriptYol("jquery-1.3.2.min.js"); 
     this.Page.Header.Controls.Add(js); 

    } 
1
protected override void OnInit(EventArgs e) 
{ 
    EnsureChildControls(); 
    base.OnInit(e); 
} 
+5

Chào mừng bạn đến với stackoverflow! Nó luôn luôn tốt hơn để cung cấp một mô tả ngắn cho một mã mẫu để cải thiện độ chính xác bài viết :) –

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