0

Scott Guthrieによる .ASHX Handlers での ASP.NET UserControls のインスタンスの作成に関するこの非常に役立つ記事を見つけました。

残念ながら、親ページに依存する UserControl のインスタンスを作成する必要があるという要件があります。この場合、同じメソッドを使用して UserControl を作成することはできません。

誰かが私がこれについてどうすればよいか提案できますか? 親ページのインスタンスを作成し、そこに含まれる UserControl のコンテンツを取得するには、何が必要ですか?

参考までに、私が扱っている依存関係の種類を具体的に説明すると、UserControl は Factsheet のメイン ページにあるパネルです。ユーザーの構成設定に応じて、さまざまなコントロールが Factsheet の基本クラス FactsheetBuilderPage で動的に生成され、ページに含まれます。

UserControl には、次のようなプロパティがあります。

public DateTime EffectiveDate
{
    get
    {
        return ((FactsheetBuilderPage)this.Page).EffectiveDate;
    }
}

public Site ConfiguredSite
{
    get { return ((FactsheetBuilderPage)this.Page).SiteConfiguration; }
}

public ConfiguredFund Fund
{
    get
    {
        return ((FactsheetBuilderPage)this.Page).Fund;
    }
}

これは FactsheetBuilderPage クラスを参照します。つまり、参照する FactsheetBuilderPage クラスを作成する必要があります。

既存のコード ベースを変更せずにこの問題を解決できれば理想的です。

みんなありがとう

デイブ

4

3 に答える 3

3

あなたはこれに足を踏み入れました、私は恐れています。ページに依存するユーザー コントロールを作成する場合、なぜ分離するのでしょうか。ユーザー コントロールは、モジュール性を作成するために使用されます。ページに依存することは想定されていません。

とはいえ、依存とは何ですか?明らかにページが必要ないので、ページなしで必要なものを提供できるかもしれません。

于 2010-02-10T22:13:38.550 に答える
1

わかりましたので、解決策は、親ページを参照するゲッターを使用するだけでなく、UserControl のプロパティを自動に変更することであることが判明しました。

public ConfiguredFund Fund { get; set; }

public DateTime EffectiveDate { get; set; }

public Site ConfiguredSite { get; set; }

これは、ユーザー コントロールがインスタンス化されるときに、これらのプロパティに値を明示的に割り当てる必要があることを意味します。これにより、必要なデータを提供できる限り、親ページを必要とせずに、この UserControl のインスタンスをどこにでも作成できます。

次に、Handler で UserControl のインスタンスを作成し、必要なプロパティを割り当てます。

private MyUserControl GetUserControl(int id)
{
    MyUserControl myUc = GetUserControl("Controls/MyUserControl.ascx");

    myUc.Fund = new ConfiguredFund(id);
    myUc.EffectiveDate = DateTime.Now;
    myUc.ConfiguredSite = siteManager.GetSiteById(2);

    return myUc;
}

次に、レンダリングされた html を取得するために、Scott Guthrie のコードを少し変更したバージョンを使用します。

public static string RenderView(MyUserControl viewControl, object data)
{
    Page pageHolder = new Page();

    if (data != null)
    {
        Type viewControlType = viewControl.GetType();
        FieldInfo field = viewControlType.GetField("Data");

        if (field != null)
        {
            field.SetValue(viewControl, data);
        }
        else
        {
            throw new Exception("View file doesn't have a public Data property");
        }
    }

    pageHolder.Controls.Add(viewControl);

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

    return output.ToString();
}

みんなありがとう

デイブ

于 2010-02-12T10:34:17.053 に答える
0

いくつかの方法でページを作成して実行できます。1 つは BuildManager クラスを使用して、次のようにページをインスタンス化することです。

ページ ページ = BuildManager.CreateInstanceFromVirtualPath("/my/app/page.aspx", typeof(MyPageClass) ) as Page;

ただし、ページを現在のリクエスト コンテキストで実行する必要がある場合は、次の方法を試してください。

Page page = new MyPageClass();  
page.AppRelativeVirtualPath = 
         context.Request.AppRelativeCurrentExecutionFilePath; 
page.ProcessRequest(context);

もちろん、これはRick Strahl の厚意によるものです。

于 2010-02-10T22:08:05.803 に答える