C#カスタムクラスを使用してWebユーザーコントロールを作成しようとしていますが、オブジェクトがオブジェクトエラーのインスタンスに設定されていません

Velocibadgery

あなたがこれで私を助けてくれることを願っています。さまざまなカテゴリで内部的に使用されているドキュメントのリストを表示するために、内部Webフォームasp.netサイトを作成しています。

私は、ドキュメントを保持するリストに入れるカスタムドキュメントクラスを作成し、次に、サイト上の任意の場所にドキュメントを表示するカスタムWebユーザーコントロールを作成することにしました。

ドキュメントクラスは、私のApp_Codeフォルダーの一般的なクラスファイルにあります。

キャビネット.cs

public class Document
{
    private string _Url;
    private string _Title;
    public Document(string URL, string Title)
    {
        _Url = URL;
        _Title = Title;
    }

    public string URL
    {
        get { return _Url; }
        set { _Url = value; }
    }

    public string Title
    {
        get { return _Title; }
        set { _Title = value; }
    }
}

このコードは問題なく機能します。次に、ユーザーコントロールで、タイプドキュメントのリストを作成し、Page_Load()で開始します。次に、新しいドキュメントをリストに追加するためのパブリックメソッドを作成しました。

DocDisplay.ascx.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

public partial class DocDisplay : System.Web.UI.UserControl
{
    private List<Document> _DocList;

    protected void Page_Load(object sender, EventArgs e)
    {
        _DocList = new List<Document>();
    }

    public void Add(string URL, string Title)
    {
        _DocList.Add(new Document(URL, Title));
    }

    public void WriteDocuments()
    {
        foreach (Document doc in _DocList)
        {
            Response.Write($"<span class='document'><a href='{doc.URL}'>{doc.Title}</a></span>");
        }
    }
}

addメソッドでエラーが発生します。私のオブジェクトはオブジェクトのインスタンスではないと言っています。しかし、私はPage_Loadでそれを行います。

index.aspx.cs

protected void Page_Load(object sender, EventArgs e)
{
    pageDocs.Add("index.aspx", "Hello World!");
    pageDocs.Add("index.aspx", "Red Rum");
    pageDocs.Add("index.aspx", "Lorum Ipsum");
}

インデックスページにユーザーコントロールを登録しました。

<%@ Register Src="~/DocDisplay.ascx" TagPrefix="uc" TagName="DocDisplay" %>

<uc:DocDisplay ID="pageDocs" runat="server" />

そのため、なぜそのエラーが発生するのか正確にはわかりません。私の知る限り、私のコードには何の問題もありません。あなたが助けることができれば私はそれを大いに感謝します。

マドリフレクション

イベントは、コントロール階層のルートから始まり、リーフノードで終了します。リストをインスタンス化する機会があるIndex.Page_Load前に呼び出されDocDisplay.Page_Loadています。

この_DocListフィールドは、何かで使用する前に値を必要とするため、初期化はできるだけ早く行う必要があります。これは、フィールド初期化子を使用すると非常に簡単に実行できます。一度に宣言して割り当てます。

private List<Document> _DocList = new List<Document>();

ときにIndexクラスがページのライフサイクルの早い段階でその子コントロールをインスタンス化し、_DocListすぐにオブジェクト参照を持つことになります。

「Page_Initはもっと早く呼び出されます。そこでやります」と言いたくなります。これは最初はうまくいくかもしれませんが動的制御の読み込みを行うと、それがバランスをとる行為であることがすぐにわかります。動的にロードされたコントロールはイベントキャッチアップを再生Initする必要があるため、静的にロードされたコントロールがLoadイベントの発生を開始した後にそのイベントを発生させることができます。各イベントをタイミングではなく目的に使用し、コンストラクター(およびフィールド初期化子)を使用して非制御クラスの状態を初期化することが重要です。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

Related 関連記事

ホットタグ

アーカイブ