2013-01-15 25 views
0

我改寫了我的MVC應用程序的一部分,有一天,現在我得到一個RuntimeBinderException指出「無法執行運行時對空引用結合」。ASP.NET MVC應用程序不喜歡我的for循環

我分配在控制器中的ViewBag變量AvailableDocuments集合(字典),並通過它查看迭代。我可以把它通過第一循環就好了,但是當代碼到達第二個for循環的出口點它拋出該異常。我已經用幾種不同的方式重寫了這一點,並且總是遇到同樣的問題。我可以擺脫此異常的唯一方法是從此視圖中刪除第二個/第三個循環。另外,我已經使用調試器來驗證我不是在收集和第一循環不是(毫無理由地)進行更改此集合收到任何空值。

@foreach (KeyValuePair<int, string> doc in ViewBag.AvailableDocuments) 
{ 
    <option value="@doc.Key" @((ViewBag.Product.Documents[0].OriginalDocID == doc.Key) ? "selected" : "")>@doc.Value</option> 
} 

這是重複三次(填充三個下拉列表)的for循環。唯一改變的是文檔索引(不爲空)。

Line 62: <select name="Doc1" style="width:300px;">
Line 63: <option value="-1">Don't Display a Document</option>
Line 64: @foreach (KeyValuePair<int, string> doc in ViewBag.AvailableDocuments)< --break LINE
Line 65: {
Line 66: <option value="@doc.Key" @((ViewBag.Product.Documents[0].OriginalDocID == doc.Key) ? "selected" : "")>@doc.Value</option>'

和消息:

Exception Details: Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: Cannot perform runtime binding on a null reference

+0

明顯的候選者是'ViewBag.Product'和'ViewBag.Product.Documents [0]'。仔細檢查它們。 –

+0

刪除整個三元表達式後仍然拋出相同的異常。我實際上可以清空循環,並以相同的錯誤結束。 – krik

回答

1

你是從數據庫或web服務讀取ViewBag.Product.Documents的數據?如果是的話,我猜你正在運行到與延遲加載的問題(沒有被請求的數據,直到需要它)。發生異常是因爲在請求數據時,源不再可用。

在後面的代碼,在任務中添加ToList(),看看是否能解決問題:

ViewBag.Product.Documents = something.GetProductDocuments.ToList(); 
+0

我一直在想,這將是源頭不再可用,但我無法追捕這個問題。添加ToList不起作用。 – krik

+0

你的代碼是什麼樣子,填充ViewBag產品和Product.Documents屬性? –

0

如果創建所需要的數據波蘇斯的集合會發生什麼,可能是因爲這樣簡單

public class OptionItem 
{ 
    public int Id {get; set;} 
    public string Text {get; set;} 
} 

,並將其添加到集合的視圖模型,並傳遞到視圖?通過這種方式,您知道所有數據都是他們在進入您的視圖之前的數據。我個人會避免使用viewbag來做這樣的事情。

+0

當通過ViewModel傳遞集合時,我得到同樣的問題。 – krik