2009-05-08 6 views
10

Có cách nào để tôi có thể sử dụng C# để tải và sau đó "hiển thị" điều khiển ascx không?Tải thành phần ascx bằng cách sử dụng mã C#

Về bản chất tôi đang cố thay thế ASP nội tuyến bằng hàm C# sẽ trả về cùng một HTML. Điều này sau đó sẽ cho phép tôi thiết lập nó như là một webmethod để tôi có thể cập nhật phần đó của trang với jQuery, sử dụng cùng một mã đã tạo ra html gốc.

Tôi thực sự cần một số cách để làm điều này, và điều này có vẻ giống như một tuyến đường hợp lý.

Trả lời

17

Bạn cần phải tạo một trang mà bạn làm cho kiểm soát:

public static string RenderUserControl(string path) 
{ 
    Page pageHolder = new Page(); 
    Control viewControl = pageHolder.LoadControl(path); 

    pageHolder.Controls.Add(viewControl); 
    using(StringWriter output = new StringWriter()) 
    { 
     HttpContext.Current.Server.Execute(pageHolder, output, false); 
     return output.ToString(); 
    } 
} 

Một điều khiển người dùng ngày của riêng mình sẽ không render. (This article có một số thông tin liên quan mà từ đó tôi đã mượn một số mã).

1

Tôi đã không cố gắng này, nhưng bạn có thể tải một điều khiển bằng cách sử dụng chức năng LoadControl:

Control Example = LoadControl("~\\Controls\\MyControl.ascx"); 

Sau đó, bạn có thể thử render điều khiển:

StringWriter sw = new StringWriter(); 
HtmlTextWriter htw = new HtmlTextWriter(sw); 
Example.RenderControl(htw); 
Response.Write(sw.ToString()); 
Response.End(); 

Nhưng chắc chắn rằng bạn ghi đè VerifyRenderingInServerForm và chuyển EnableEventValidation thành false trên trang.

Hãy quên những gì tôi đã viết ở trên. Tôi đã quay trở lại và thử nghiệm và bạn không thể gọi LoadControl vì webmethod là tĩnh. Vì nó tĩnh nên bạn không có đối tượng Trang để gọi ... Điều đó có nghĩa là không tải các điều khiển người dùng động.

+1

Bạn đang thực sự chủ yếu là đúng. MyUsercontrol uc = (MyUserControl) Page.LoadControl ("/ path/to/MyUserControl.ascx"); Sau đó, bạn có thể làm SomeItem.Controls.Add (uc); hoặc hiển thị điều khiển thành chuỗi như bạn đã minh họa, sau đó thêm mục dom lập trình bằng jQuery, hoặc hoạt động. – Serapth

+0

Thực ra tôi không nghĩ rằng việc thêm điều khiển sẽ là một lựa chọn trong trường hợp này. Không có postback đầy đủ (không có đối tượng trang hoặc bất kỳ đối tượng nào để thêm điều khiển), gọi từ jQuery, vv Nhưng cách tiếp cận của Keltex hoạt động. – JaCraig

1

Điều này Explanation cần có câu trả lời bạn đang tìm kiếm. Về cơ bản bạn phải khai báo điều khiển trong trang sau đó LoadControl trong codebehind.

1

Câu trả lời của Keltex là câu trả lời duy nhất có hiệu quả đối với tôi vì tôi đang làm việc với các điều khiển người dùng lồng nhau. Ngoài ra, nếu bạn muốn vượt qua các thông số để điều khiển người dùng của bạn, bạn có thể làm như vậy bằng cách:

_MyNameSpace_MyUserControl viewcontrol = (_MyNameSpace_MyUserControl) pageHolder.LoadControl(path); 

viewcontrol.MyParam = "My value"; 
0

của nó rất đơn giản để sử dụng:

yourItem.Controls.Add(LoadControl("~/user control File path"));