Asp.net
如何在 MVC Razor 中處理空子實體
我有一個迭代 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 方法設為擴展或靜態是您的選擇。