2

我想设计我的自定义编辑器模板,以便它们即使在传递空模型时也能正常工作。即,@Html.EditorForModel()何时Model为空。

我遇到的问题是,当我在 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);
}

并像这样在 EditorTemplate 中使用它

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

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

我想知道如果模型存在,是否有内置或“正确”的方式来尝试访问这些属性,而不抛出NullReferenceException.

4

2 回答 2

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()
}

这样在模板中您不再需要检查模型是否为空。

于 2012-04-19T06:13:47.920 回答
0

诀窍是使编辑器模板中的传入模型为可空类型,int? 对于整数,日期时间?对于日期,布尔?对于布尔值等...

所以在 Integer.cshtml 的顶部你会有 int?而不是 int

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

假设您为货币创建了一个名为 Currency.cshtml 的编辑器模板,您将在顶部具有以下类型

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

仅供参考,.NET 中的可为空类型有两种方便的方法:GetValueOrDefault 和 HasValue。

于 2012-04-18T21:17:03.507 回答