2014-03-12 28 views
0

因此,vb有很多討論「在錯誤恢復下一個」,現在我真的需要在C#剃鬚刀視圖中類似的東西。在asp.net Razor視圖中,是否有繼續出現錯誤?

它可能不存在,購買也許有另一種方式來完成類似的東西?

我試圖創建一個簡單的剃​​刀視圖,這是一個只讀頁面,用於打印。然而這種觀點將有場很多,幾百行是這樣的:

​​

的問題是,銷售代表可能是零,這將引發錯誤。如果我在@{if(Model.salesRep1.firstName != null){}}語句中包裝每個字段,頁面上的代碼數量將大幅增加。

on error resume next添加到頁面的頂部並且不用擔心空值將會是超級光滑的。有沒有類似的解決方案?

感謝,

+5

否,並且也不應該有。在構建ViewModel時處理這些問題! – Jamiec

+0

難道你不能在文件的開頭放置@if(Model.salesRep1 == null)Model.salesRep1 = new XXX();'? –

+1

@MenelaosVergis - 這是*不*顯示邏輯,因此不應該在視圖中。但是,這只是構建ViewModel時應該執行的操作。 – Jamiec

回答

2

視圖應該只包含視圖邏輯,甚至應該只擴展到從視圖模型輸出屬性。

控制器通常負責構建此視圖模型,並且此時您應該默認任何屬性,以確保在嘗試顯示它們時它們不爲null。

因此,例如,在控制器,你可能有:

var emptySalesRep = new SalesRep(); 

var model = new MyModel(); 
model.salesRep1 = repository.GetSalesRep1() ?? emptySalesRep; 

現在,它可能是你有很多這方面的,所以你可以選擇,而不是離開salesRep1空,並有另一種方式在視圖中處理此問題而不回覆到大量的if(Model.salesRep1 != null){ ... }

的擴展方法可以用於(雖然我更喜歡上面的方法)

public static string DisplayForWhenNotNull<T>(this HtmlHelper html, Func<T> obj, Func<T,object> prop) 
{ 
    var item = obj(); 
    if(item == null) 
    { 
     return null; 
    } 
    return prop(item); 
} 

用法:

<td class="label">Sales Rep #1:</td> 
<td class="val">@Html.DisplayForWhenNotNull(() => Model.salesRep1, sr => sr.name)</td> 
0

而是在視圖中檢查NULL值,或試圖忽略的錯誤,我會使用一個視圖模型,並確保銷售代表不爲空在那裏。

相關問題