6

ユーザー コントロールを文字列にレンダリングしようとしています。アプリケーションは、ユーザーがトークンを使用できるように設定され、トークンが見つかった場所にユーザー コントロールがレンダリングされます。

StringBuilder sb = new StringBuilder();
StringWriter sw = new StringWriter(sb);
HtmlTextWriter writer = new HtmlTextWriter(sw);

Control uc = LoadControl("~/includes/HomepageNews.ascx");
uc.RenderControl(writer);
return sb.ToString();

そのコードはコントロールをレンダリングしますが、コントロールの Page_Load で呼び出されるイベントはどれも発生していません。コントロールにリピーターがあり、起動する必要があります。

4

3 に答える 3

13

Scott Guthrie が彼のブログで提供している次のコードをかなり長い間使用してきました。

public class ViewManager
{
    public static string RenderView(string path, object data)
    {
        Page pageHolder = new Page();
        UserControl viewControl = (UserControl) pageHolder.LoadControl(path);

        if (data != null)
        {
            Type viewControlType = viewControl.GetType();
            FieldInfo field = viewControlType.GetField("Data");
            if (field != null)
            {
                field.SetValue(viewControl, data);
            }
            else
            {
                throw new Exception("ViewFile: " + path + "has no data property");
            }
        }

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

このobject dataパラメーターは、ユーザー コントロールへのデータの動的な読み込みを可能にし、配列などを介して複数の変数をコントロールに挿入するために使用できます。

このコードは、コントロール内のすべての通常イベントを発生させます。

詳細については、こちらをご覧ください。

よろしくジェスパー・ハウジ

于 2008-11-03T20:15:35.463 に答える
2

コントロールをページのコントロールコレクションまたはページ上のコントロールに追加して、コントロールをページにアタッチする必要があります。通常のページレンダリングイベント中にレンダリングを明示的に無効にするために何かを行わない限り、これですべての問題が解決されるわけではありません。

于 2008-11-03T14:55:20.463 に答える
1

上記の Hauge/Scott Guthrie のメソッドを使用して、リフレクションを使用したり、特別なインターフェイスを実装するために UserControl を変更したりする必要がないように微調整しました。重要なのは、リフレクションを行う代わりに、上記の RenderView メソッドが呼び出す、厳密に型指定されたコールバックを追加したことです。

ヘルパーのメソッドと使用法をここにブログしました

HTH、ジョン

于 2009-10-29T13:11:19.263 に答える