2013-02-05 22 views
2

我有這樣的代碼:如何以編程方式用Form和UserControl構建System.Web.UI.Page?

public static string RenderView(string path) 
{ 
    Page pageHolder = new Page(); 
    UserControl viewControl = (UserControl)pageHolder.LoadControl(path); 

    pageHolder.Controls.Add(viewControl); 

    StringWriter output = new StringWriter(); 
    HttpContext.Current.Server.Execute(pageHolder, output, false); 

    return output.ToString(); 
} 

這是從運行:

[WebMethod] 
    public string GetReportsHTML() 
    { 
     string output = ""; 

     output = ViewManager.RenderView("ReportsControl.ascx"); 

     return output; 
    } 

這是測試渲染ASCX文件,並把它們吐掉了一個SOAP/REST的服務。

問題是,如果某些控件(runat = server ones)沒有封裝在runat = server標籤中,則會失敗。

解決方案是here,但解決方案假定在ASPX文件中,我可以編輯標記。

我將如何以編程方式構建一個頁面,添加一個窗體,設置runat = server,以便我可以遵循該解決方案並將我的控件添加到窗體控件?

+0

你可以建立一個佔位符控制一個靜態頁面,然後你的用戶控件加載到這一點。 – nunespascal

+0

根據對* .aspx.designer.cs' /'vb'文件的要求,是否必須編譯引用服務器端頁面上的任何對象以引用? – Paul

+0

嗯,不知道,但jbl的答案有用。我只是不知道HTML

標籤 – RoboJ1M

回答

2

你試過類似的東西嗎?

public static string RenderView(string path) 
{ 
    Page pageHolder = new Page(); 
    System.Web.UI.HtmlControls.HtmlForm formHolder = new System.Web.UI.HtmlControls.HtmlForm(); 
    pageHolder.Controls.Add(formHolder); 

    UserControl viewControl = (UserControl)pageHolder.LoadControl(path); 

    formHolder.Controls.Add(viewControl); 

    StringWriter output = new StringWriter(); 
    HttpContext.Current.Server.Execute(pageHolder, output, false); 

    return output.ToString(); 
} 

希望這將有助於

+0

周圍的服務器端包裝的名稱完美,謝謝! – RoboJ1M