2011-04-29 48 views
2

在Details.cshtml頁面下面的代碼:的NullReferenceException包括LINQ表達MVC3

@{ 
      @Html.Raw(" | "); 
      for (int i = 0; i < Model.Payments.Count; i++) 
      { 
       @Html.Raw("<a href=../../Payment/Details/" + Model.ID + "/" + Model.Payments.ElementAt(i).accountID + ">" + Model.Payments.ElementAt(i).Account.landIOC + "</a>");   
       @Html.Raw(" | "); 
      } 
     } 

Model.Payments.ElementAt(I).Account是出於某種原因始終是NULL,雖然付款總是有且只有一個帳戶,並我們在我們的LINQ表達式(PaymentController)中包含帳戶:

_erasDb.Payments.Include("Account").Include("Event").Where(...) 

我們不知道爲什麼Account是NULL。有關完整代碼,請參見:

http://pastebin.com/Yf1JDsMF

+0

我們使用MVC3和Razor View Engine 對於我們的數據庫訪問,我們有一個.edmx與ADO.NET自我跟蹤實體生成器。 – Matthias 2011-04-29 10:00:32

回答

4

多次調用ElementAt是非常低效。只需切換到foreach - 它應該修復ElementAt返回null,更高效,更簡單。

而且,爲什麼不乾脆:

<text> | </text> 
foreach(var payment in Model.Payments) 
{ 
    <a href=../../Payment/Details/@Model.ID/@payment.accountID">@payment.Account.landIOC</a>   
    <text> | </text> 
} 

如果使用大量的@Html.Raw(...),你就錯失了一個絕招......尤其是,你站在如果您使用開啓XSS漏洞的一個很好的機會太多.Raw

+0

您好,先生,是我們項目的救星:D♥ – Matthias 2011-04-29 10:33:54

+0

該死的,我過早地歡呼起來......現在工作一半時間......非常奇怪。 – Matthias 2011-04-29 10:40:07

+0

@Matthias - 有沒有情況下帳戶本身爲空? – 2011-04-29 10:41:21

2

問題:首先使用數據庫,模型或代碼的EF計劃是什麼?
在您的視圖中,您可以使用<text> | </text>來替換Html.Raw(「|」);
您的鏈接生成策略再次有點有線。這些鏈接,我想,有相應的行動,所以必須有路線,你可以使用Html.ActionLink。
並在foreach(在Model.Payments變種M)迭代可以使你的代碼多一點prety:

@{ 
<text> | 
    @foreach(var m in Model.Payments){ 
    <text> 
    @Html.ActionLink(m.Account.landIOC,"Details","Account",new{Id = m.ID, AccountId= m.AccountID}) | 
    </text> 
    } 
</text> 
} 

現在,這可能是一個起點。

+0

同樣的問題。的NullReferenceException – Matthias 2011-04-29 11:45:13