Asp.net

如何在 MVC Razor 中處理空子實體

  • May 12, 2013

我有一個迭代 Orders 集合的 MVC 剃刀視圖。每個訂單都有一個客戶,可以為空。

麻煩的是,在這種情況下,我得到一個空引用異常。

@foreach (var item in Model) {
<tr>
       <td>
       @Html.ActionLink("Edit", "Edit", new { id=item.ID }) |
       @Html.ActionLink("Delete", "Delete", new { id=item.ID })
   </td>
   <td>
       @item.Number
   </td>
   <td>
       @String.Format("{0:g}", item.ReceivedDate)
   </td>
   <td>
       @item.Customer.Name
   </td>

當 item.Customer 為空時,@item.Customer.Name 會爆炸(如您所料)。

這一定是一個簡單的問題,但一直無法找到答案!

在不設置 ViewModel 的情況下,處理這個問題的最佳方法是什麼?

謝謝鄧肯

嘗試以下操作:

<td>        
   @(item.Customer != null ? item.Customer.Name : "")
</td>

編輯:封閉以確保它可以在 Razor 中工作。

Html.DisplayFor(m => m[i].Customer.Name)首先,如果您要使用 for 迭代而不是 foreach,則可以使用內置的 html 助手。但這幾乎沒有缺點。您可能沒有索引器集合屬性和 DisplayFor 方法獲取表達式參數並編譯它,這是昂貴的。

代替它們,您可以創建自己的方法來更好地處理這種情況,如下所示。

public static class Utility
{
   public static TValue NullSafe<T,TValue>(this T obj,Func<T,TValue> value)
   {
       try
       {
           return value(obj);
       }
       catch (NullReferenceException/*Exception can be better choice instead of NullReferenceException*/)
       {
           return default(TValue);
       }
   }
}

現在你可以愉快地使用它了

@item.NullSafe(m=>m.Customer.Name)

將 NullSafe 方法設為擴展或靜態是您的選擇。

引用自:https://stackoverflow.com/questions/5794433