C#を使用してascxコントロールをロードしてから「レンダリング」する方法はありますか?
基本的に、インラインASPを同じHTMLを返すC#関数に置き換えようとしています。これにより、元のhtmlを生成したのと同じコードを使用して、ページのそのセクションをjQueryで更新できるように、Webメソッドとして設定できます。
私は本当にこれを行うための何らかの方法が必要です、そしてこれは論理的なルートのようです。
コントロールをレンダリングするページを作成する必要があります。
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();
}
}
ユーザーコントロール自体はレンダリングされません。(この記事には、私がいくつかのコードを借りたいくつかの関連情報があります)。
ネストされたユーザーコントロールを使用していたので、Keltexの答えだけが私のために機能しました。さらに、ユーザーコントロールにパラメーターを渡したい場合は、次の方法で行うことができます。
_MyNameSpace_MyUserControl viewcontrol = (_MyNameSpace_MyUserControl) pageHolder.LoadControl(path);
viewcontrol.MyParam = "My value";
この説明には、あなたが探している答えが含まれているはずです。基本的に、ページでコントロールを宣言してから、コードビハインドでLoadControlを宣言する必要があります。
私はこれを試していませんが、LoadControl関数を使用してコントロールをロードできます。
Control Example = LoadControl("~\\Controls\\MyControl.ascx");
次に、コントロールのレンダリングを試すことができます。
StringWriter sw = new StringWriter();
HtmlTextWriter htw = new HtmlTextWriter(sw);
Example.RenderControl(htw);
Response.Write(sw.ToString());
Response.End();
ただし、必ずVerifyRenderingInServerFormをオーバーライドし、ページでEnableEventValidationをfalseに切り替えてください。
私が上で書いたことを忘れてください。戻ってテストしましたが、webmethodが静的であるため、LoadControlを呼び出すことができません。静的であるため、呼び出すPageオブジェクトはありません...つまり、ユーザーコントロールを動的にロードする必要はありません。
使い方はとても簡単です。
yourItem.Controls.Add(LoadControl("~/user control File path"));