2013-01-10 101 views
3

我可能在做一些愚蠢的事情,但找不到什麼。我想在ASP.NET MVC修改簡單的會員功能4.我稍微修改與模板來一個RegisterModel,並添加類別列表,以它像這樣:將項目添加到列表中<T>

public class RegisterModel 
{ 
    ... 

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

然後在賬戶控制器I 「米試圖將項目添加到這個列表,但得到‘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" }); 
... 

任何想法,爲什麼?

+3

分類永遠不會被建造? – Nick

+6

'rm.Categories'爲'null'。 – sloth

回答

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 
    } 
7

在你的類的構造函數由於您使用的是auto-implemented property{get;set;}你必須在構造函數初始化它初始化列表

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

。如果你不想在構造函數中做,那麼你可以這樣做:

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,每個對象的創建。

5

您從未初始化Categories任何東西。它是null

它初始化爲空列表,以避免錯誤,最好是在構造函數中:

Categories = new List<SelectListItem>();