0

在集合为空时将视图模型发送到视图时的火花使我有些头疼,如下所示:

<input value="model.addresses[0].street" />

其中“model.addresses”可能为空,因此会给出 NRE。

除了在渲染之前填充集合之外,还有什么方法可以处理这个问题。这有点痛苦,因为它需要一些自定义处理来确保它们被填充。我在想火花条件属性会起作用:

<input value="model.addresses[0] != null?model.addresses.street" />

但我觉得可能有更好的方法来处理这些情况。

4

2 回答 2

2

我看到了其他几个选项:

  1. 对列表项使用部分视图并在那里检查一次 NULL。
  2. 添加扩展方法以简化 NULL 检查。

这些是我为自己编写的最常用的扩展方法之一:

    public static TResult PropGet<TObject, TResult>(this TObject obj, Func<TObject, TResult> getter, TResult defaultValue) {
        if (ReferenceEquals(obj, null))
            return defaultValue;
        var res = getter.Invoke(obj);
        return ReferenceEquals(res, null) ? defaultValue : res;
    }

    public static TResult PropGet<TObject, TResult>(this TObject obj, Func<TObject, TResult> getter) {
        return PropGet(obj, getter, default(TResult));
    }

因此,根据您的观点,您可以这样写:

<input value="model.addresses[0].PropGet(a => a.street)" />
于 2009-11-26T05:14:30.783 回答
1

从火花文档:

如果您想确保任何空值和由表达式产生的 NullReferenceException 根本不会产生任何输出,也可以使用语法 $!{expression}。

http://sparkviewengine.com/documentation/expressions#Nullsinexpressions

于 2009-11-28T19:22:28.723 回答