2011-11-11 35 views
5

Tôi có một tải là UserControl đối tượng (ascx tệp) trong dự án nhỏ của riêng họ. Sau đó tôi tham khảo dự án này trong hai dự án: REST API (là một dự án thư viện lớp) và trang web chính.Lập trình biểu diễn một trang web UserControl

Tôi chắc chắn điều này sẽ dễ dàng trên trang web, chỉ cần sử dụng Controls.Add trong bất kỳ điều khiển Panel hoặc ASP.NET nào sẽ hoạt động.

Tuy nhiên, còn API thì sao? Có cách nào tôi có thể hiển thị HTML của điều khiển này, chỉ đơn giản bằng cách biết loại điều khiển? Phương thức RenderControl không viết bất kỳ HTML nào cho người viết vì vòng đời của kiểm soát thậm chí không bắt đầu.

Hãy nhớ rằng tôi không có các điều khiển trong dự án web, vì vậy tôi không có đường dẫn ảo đến tệp ascx. Vì vậy, phương pháp LoadControl sẽ không hoạt động ở đây.

Tất cả các điều khiển thực sự xuất phát từ cùng một điều khiển cơ sở. Có bất cứ điều gì tôi có thể làm từ bên trong lớp cơ sở này mà sẽ cho phép tôi để tải điều khiển từ một trường hợp hoàn toàn mới?

Trả lời

8

Đây là những gì tôi đã làm gần đây, hoạt động tốt, nhưng hiểu được postbacks sẽ không hoạt động nếu bạn sử dụng nó bên trong ứng dụng ASP.NET của bạn.

[WebMethod] 
public static string GetMyUserControlHtml() 
{ 
    return RenderUserControl("Com.YourNameSpace.UI", "YourControlName"); 
} 

public static string RenderUserControl(string assembly, 
      string controlName) 
{ 
     FormlessPage pageHolder = 
       new FormlessPage() { AppRelativeTemplateSourceDirectory = HttpRuntime.AppDomainAppVirtualPath }; //allow for "~/" paths to resolve 

     dynamic control = null; 

     //assembly = "Com.YourNameSpace.UI"; //example 
     //controlName = "YourCustomControl" 
     string fullyQaulifiedAssemblyPath = string.Format("{0}.{1},{0}", assembly, controlName); 

     Type type = Type.GetType(fullyQaulifiedAssemblyPath); 
     if (type != null) 
     { 
      control = pageHolder.LoadControl(type, null); 
      control.Bla1 = "test"; //bypass compile time checks on property setters if needed 
      control.Blas2 = true; 

     }       

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


public class FormlessPage : Page 
{ 
    public override void VerifyRenderingInServerForm(Control control) 
    { 
    } 
} 
+0

Tìm kiếm sự khéo léo tốt. Chỉ cần cố gắng thực hiện điều đó ngay bây giờ trong cấu trúc của tôi. Một điều tôi đã nhận thấy mặc dù - 'HtmlForm form = new HtmlForm();'. Biến này không bao giờ được sử dụng, bởi vì 'form.Controls.Add' được nhận xét? Tui bỏ lỡ điều gì vậy? – Connell

+0

Tôi sẽ cập nhật, có một cách để thực hiện với biểu mẫu thông thường, nhưng nếu điều khiển của bạn không có thẻ biểu mẫu hoặc bạn không thêm thẻ biểu mẫu, bạn sẽ gặp lỗi thời gian chạy. Đó là những gì lớp FormLessPage bỏ qua cho bạn. –

1

This sẽ hoạt động. Bạn có thể tạo điều khiển loại đó và sử dụng số HtmlTextWriter của riêng mình.

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