Manipulação de coleções vazias em vista modelo com faísca
-
05-07-2019 - |
Pergunta
Em faísca quando o envio de um modelo de vista para a vista quando uma coleção é vazio está me causando algumas dores de cabeça assim:
<input value="model.addresses[0].street" />
Onde "model.addresses" pode ser vazia e, portanto, dá uma NRE.
Existe uma maneira de lidar com isso diferente de preencher as coleções antes da renderização. Este é um pouco de dor, pois reqiures algum processamento personalizado para se certificar de que eles são preenchidos. Eu estava pensando o atributo condicional faísca iria funcionar:
<input value="model.addresses[0] != null?model.addresses.street" />
Mas eu sinto que pode haver uma maneira melhor de lidar com essas situações.
Solução
De documentação faísca:
A sintaxe $ {expressão} também pode ser usado se você quiser garantir quaisquer valores nulos e NullReferenceException que resultam da expressão produzirá nenhuma saída em tudo.
http://sparkviewengine.com/documentation/expressions#Nullsinexpressions
Outras dicas
Eu vejo algumas outras opções:
- Use vista parcial para itens de lista e verificar valores nulos, uma vez lá dentro.
- Adicionar método de extensão para simplificar as verificações nulos.
Estes são um dos métodos mais usados ??de extensão que escrevi para mim mesmo:
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));
}
Assim, em sua visão, você pode escrever o seguinte:
<input value="model.addresses[0].PropGet(a => a.street)" />