是否有正确的方法来检查EditorTemplate中模型的属性值

时间:2012-04-18 20:59:06

标签: asp.net-mvc asp.net-mvc-3 razor editorfor

我想设计自定义编辑器模板,以便即使传递空模型也能正常工作。即@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}}

2 个答案:

答案 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。