2011-11-11 2 views
5

小さなプロジェクトでは、UserControlオブジェクト(ascxファイル)の読み込みがあります。私はこのプロジェクトを2つのプロジェクト、すなわちREST API(クラスライブラリプロジェクト)とメインのWebサイトで参照します。プログラムでWeb UserControlをレンダリングする

これはウェブサイトでは簡単だと確信しています。をPanelで使用するか、ASP.NETコントロールが機能します。

ただし、APIについてはどうですか?コントロールのタイプを知るだけで、このコントロールのHTMLをレンダリングする方法はありますか? メソッドは、コントロールのライフサイクルが開始されていないため、HTMLをライターに書き込まない。

私はウェブプロジェクトのコントロールがないので、ascxファイルへの仮想パスはありません。したがって、LoadControlメソッドはここでは機能しません。

すべてのコントロールは、実際には同じ基本コントロールから派生しています。私が全く新しいインスタンスからコントロールをロードできるようにするために、この基本クラスの中から何かできることはありますか?

答えて

8

これは私が最近行ったことですが、うまく動作しますが、ASP.NETアプリケーション内で使用するとポストバックは機能しません。

[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

良いリックを探しています。ちょうど今私の構造に実装しようとしています。私が気づいたことの一つは、 'HtmlForm form = new HtmlForm();'です。 'form.Controls.Add'がコメントアウトされているので、この変数は使用されません。何か不足していますか? – Connell

+0

私は更新しますが、通常のフォームで行う方法がありますが、コントロールにフォームタグがない場合やプログラムタグを追加しない場合は、ランタイムエラーが発生します。これがFormLessPageクラスがあなたをバイパスするものです。 –

1

Thisが有効です。 そのタイプのコントロールを作成し、独自のHtmlTextWriterを使用することができます。

関連する問題