2012-04-18 54 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

相关问题