2012-04-18 22 views
2

我想要設計我的自定義編輯器模板,以便它們即使在傳遞空模型時也能正常工作。即當Model爲空時的@Html.EditorForModel()是否有適當的方法來檢查EditorTemplate中模型的屬性值

我的問題是,當我在一個EditorTemplate,我有時需要訪問該模型的特性之一,它變得很老的寫作@if(Model != null && Model.[Property] ...)

例如

@model MyObject 
@if(Model.BoolProperty) // throws NullReferenceException 
{ 
    <div>...additional stuff here</div> 
} 

@Html.EditorFor(m => m.OtherProperty) 

我考慮添加如下的擴展方法

public static R GetValue<T, R>(this WebViewPage<T> viewPage, Func<T, R> selector) 
{ 
    if (selector == null) throw new ArgumentNullException("selector"); 
    if (viewPage == null) throw new ArgumentNullException("viewPage"); 
    if (viewPage.Model == null) return default(R); 
    return selector(viewPage.Model); 
} 

並在編輯器模板中使用這樣的

@model MyObject 
@if(this.GetValue(m => m.BoolProperty)) // Safely gets value or false 
{ 
    <div>...additional stuff here</div> 
} 

@Html.EditorFor(m => m.OtherProperty) 

我想知道是否有一個內置的或「正確」的方法來嘗試如果模型的存在是爲了訪問這些屬性,不扔NullReferenceException

回答

2

爲什麼不檢查一次模板

@if (Model != null) 
{ 
    @Html.EditorForModel() 
} 

這樣裏面你不再需要檢查如果模型爲null。

+0

嗨,即使模型爲空,我仍然想顯示編輯器字段,我只是想根據模型的屬性在編輯器模板中隱藏/顯示/更改某些字段。例如,如果'Model'具有'IsRemovable'屬性,那麼當它被設置爲'true'時,我可能會渲染一個刪除按鈕,否則我不會渲染一個。很明顯,我可以編寫@if(Model!= null && Model.IsRemovable)',但是在有這些情況時會變得很渺茫,我想知道是否有內置的幫助器來處理這個問題。或者,也許我正在接近錯誤的問題。謝謝! – NKeddie 2012-04-19 13:22:38

+0

那麼你可以做一些這樣的模型是永遠不會爲空,這將避免你這個檢查。 – 2012-04-19 13:40:51

+0

看起來好像沒有更好的方法。謝謝。 – NKeddie 2012-04-19 15:50:45

0

訣竅是使編輯器模板中的傳入模型爲可空類型,int?整數,DateTime?日期,布爾?對於布爾值等...

因此,在Integer.cshtml的頂部你會有int?而不是INT

@model int? 
... your code here ... 

說你做出一個名爲Currency.cshtml錢的編輯模板,您將有以下類型頂部

@model decimal? 
... your code here... 

作爲一個僅供參考,可空類型在.NET中有兩個方便的方法:GetValueOrDefault和HasValue。調用模板時

@model MyObject 
@if (Model == null) 
{ 
    <div>Sorry, nothing to edit here<div> 
} 
else 
{ 
    ... here you can access the model properties 
} 

甚至外:

+0

嗨,謝謝你的回答。我實際上是在談論EditorTemplates的對象(引用類型),而不是像我在我的問題中錯誤提到的值類型。我試圖重新說出我的問題,使之更有意義。 – NKeddie 2012-04-18 23:49:36

相關問題