3

私はおそらく愚かなことをしているのですが、何を見つけることができません。ASP.NET MVC 4の単純なメンバーシップ機能を変更しようとしています。テンプレートに付属のRegisterModelを少し変更し、次のようにカテゴリのリストを追加しました。

public class RegisterModel
{
    ...

    public List<SelectListItem> Categories { get; set; }
}

次に、アカウントコントローラで、このリストにアイテムを追加しようとしていますが、 " Object reference not set to an instance of an object."エラーが発生します:

[AllowAnonymous]
public ActionResult Register()
{
    RegisterModel rm = new RegisterModel();

    //SelectListItem guestCategory = new SelectListItem();
    //guestCategory.Value = null;
    //guestCategory.Text = "Guest";

    rm.Categories.Add(new SelectListItem { Value = null, Text = "Guest" });
...

なぜ何かアイデアはありますか?

4

3 に答える 3

8

リストにアイテムを追加する前にこれを行う必要があります。アイテムを追加するとインスタンス化されないため、エラーが発生する理由です。

rm.Categories = new List<SelectListItem>();

つまり、この方法ではこのようにします

[AllowAnonymous]
public ActionResult Register()
{
    RegisterModel rm = new RegisterModel();

    rm.Categories = new List<SelectListItem>();//added line 

    rm.Categories.Add(new SelectListItem { Value = null, Text = "Guest" });
...

また

のコンストラクターでも同じことができますRegisterModel

public class RegisterModel
{
  public RegisterModel
  {
    Categories = new List<SelectListItem>();//added line 
  }  
于 2013-01-10T10:03:26.993 に答える
7

クラスコンストラクターでリストを初期化します

public class RegisterModel
{
    RegisterModel()
    {
     Categories  = new List<SelectListItem>();
    }
......

自動実装されたプロパティ を使用して{get;set;}いるため、コンストラクターで初期化する必要があります。コンストラクターで実行したくない場合は、次のように実行できます。

public class RegisterModel
{
    ...
    private List<SelectListItem> _Categories = new List<SelectListItem>();

    private List<SelectListItem> Categories
    {
        get { return _Categories; }
        set { _Categories = value; }
    }
}

リストを使用する前に、オブジェクトでリストを初期化することもできます。

RegisterModel rm = new RegisterModel();
r.Categories = new List<SelectListItem>(); // like that
rm.Categories.Add(new SelectListItem { Value = null, Text = "Guest" });

ただし、コンストラクターまたはプライベートフィールド (自動実装プロパティを使用しない場合)を使用しRegisterModelてリストを初期化する場合は、オブジェクトを作成するたびにクラスのオブジェクトのプロパティを初期化する必要がないため、より適切です。

于 2013-01-10T10:03:29.797 に答える
5

何にも初期化Categoriesしたことはありません。ですnull

エラーを回避するために、できればコンストラクターで空のリストに初期化します。

Categories = new List<SelectListItem>();
于 2013-01-10T10:03:32.947 に答える