我想设计自定义编辑器模板,以便即使传递空模型也能正常工作。即@Html.EditorForModel()
为Model
时为@if(Model != null && Model.[Property] ...)
。
我遇到的问题是,当我在EditorTemplate中时,我有时需要访问该模型的一个属性,而且它的编写时间很长@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)
并在EditorTemplate中使用它,就像这样
NullReferenceException
但我想知道如果模型存在,是否存在内置或“正确”方式尝试访问这些属性,而不会抛出{{1}} 。
答案 0 :(得分:2)
为什么不检查一次:
@model MyObject
@if (Model == null)
{
<div>Sorry, nothing to edit here<div>
}
else
{
... here you can access the model properties
}
甚至在调用模板时外面:
@if (Model != null)
{
@Html.EditorForModel()
}
这样在模板内部,您不再需要检查模型是否为空。
答案 1 :(得分:0)
诀窍是让编辑器模板中的传入模型成为可空类型,int?对于整数,DateTime?对于约会,布尔?对于布尔等...
那么在Integer.cshtml的顶部你会有int吗?而不是int
@model int?
... your code here ...
假设您创建了一个名为Currency.cshtml的资金编辑模板,您可以在顶部使用以下类型
@model decimal?
... your code here...
作为一个FYI,.NET中的可空类型有两个方便的方法:GetValueOrDefault和HasValue。