2012-02-21 91 views
1

我有一些C#代碼,多數民衆贊成拋出一個異常,聲稱我的ASP.NET MVC3項目:爲什麼當變量有值時會報告「空引用」?

Cannot perform runtime binding on a null reference 

的代碼拋出異常的行是:

ViewBag.Foo[i].Name = allSpark[i].Users.Name; 

這是代碼塊:

ViewBag.Foo = new myAllSparkModelType[allSpark.Length]; 
for (int i = 0; i < allSpark.Length; i++) 
{ 
    ViewBag.Foo[i].Name = allSpark[i].Users.Name; 
    ... 
} 

當我設置斷點並檢查allSpark[i].Users.Name時,它肯定有一個值(例如「Fred」)。

如果我註釋掉這行代碼,下一行(類似的代碼)會拋出相同的異常。

所以問題是要麼allSpark[i].Users.Name是一個空引用(我已經證實不是)或者我不能像我一樣使用ViewBag。如果是後者,我很困惑,因爲我認爲ViewBag可以這樣使用。

+1

你能提供一些關於創建allSpark和ViewBag實例的代碼嗎? – janhartmann 2012-02-21 07:28:27

+1

Foo [i]怎麼樣?也許它是空的 – Beatles1692 2012-02-21 07:28:30

+0

Foo [i]必須爲空,以我的理解 – kommradHomer 2012-02-21 07:29:23

回答

10

看看這個代碼:

ViewBag.Foo = new myDataModelType[allSpark.Length]; 
for (int i = 0; i < allSpark.Length; i++) 
{ 
    ViewBag.Foo[i].Name = ... 
    ... 
} 

ViewBag.Foo被初始化,但每個元件的ViewBag.Foonull,假設myDataModelType是一類。在創建數組時,每個元素都被初始化爲元素類型的默認值 - 對於引用類型,該默認值爲null。

您需要創建一個新的對象的每個元素:

for (int i = 0; i < allSpark.Length; i++) 
{ 
    ViewBag.Foo[i] = new myDataModelType(); 
    ViewBag.Foo[i].Name = ... 
    ... 
} 
+0

+1或者,當然,'ViewBag.Foo [i] = new myDataModelType {Name = ...,Bar = ...};'。或者,如果對該項目執行更復雜的操作,'var item = new myDataModelType(); //對項目的操作; ViewBag.Foo [i] = item;'反覆保存索引到數組中。 – 2012-02-21 07:44:11

+0

@AdamRalph:當然 - 我想保持最小的變化,但這些都是好事情要考慮:) – 2012-02-21 07:51:35

+0

謝謝!我不敢相信我忽略了這一點。 – TMC 2012-02-21 08:19:44

1

如果allSpark[i].Users.Name包含一個值,那麼它可能是引用左側的屬性。

檢查ViewBag.Foo是否存在,然後如果它存在於位置i。

+0

+1,但可能已經措辭好一點 – 2012-02-21 07:45:57

1

要麼ViewBag爲空,因此包含.foo [I]不存在 或富爲空和索引它是無效 或富[i]是零,因此富[I]請將.Name無效

+0

+1與我的回答相同的結論:) – 2012-02-21 07:40:13

0

您必須[I]爲其分配名稱之前創建ViewBag.Foo的一個實例。

ViewBag.Foo = new myDataModelType[allSpark.Length]; 
for (int i = 0; i < allSpark.Length; i++) 
{ 

ViewBag.Foo[i] = new ObjectThatHasNameProperty(); 
    ViewBag.Foo[i].Name = allSpark[i].Users.Name; 

} 

allSpark[i].Users.Name具有價值,但這樣ViewBag.Foo[i]不例外。

相關問題