1

我正在使用 MVC3、Razor、C#。

我有一些包含一些 LINQ 的 Razor 代码。它尝试从列表中获取值。有时列表为空。目前,由于此原因,应用程序正在引发空异常,即“myCustomers”为空。

编码:

Model.myCustomers.First().Name

基本上“myCustomers”被定义为:

public List<Customer> myCustomers

并由“LINQ to Entity”查询填充。

如果“myCustomers”为空,我如何确保剃须刀代码不会崩溃。我不想为每个属性写很多“if (Name!=null)”类型的块。由于布局设计问题,我无法遍历所有属性。所以我需要改变:

Model.myCustomers.First().Name

某种程度上来说。

希望这个问题不会太令人困惑!

提前谢谢了。

编辑 1

我喜欢不返回空值而是空列表的逻辑。我尝试使用类似的东西

return this._myCustomers ?? Enumerable.Empty<Customers>().ToList(); 

最好有办法在 Razor 页面中的 LINQ 的一行中测试它是否为空,而不是在“IF”块中。

编辑 2

    public static TValue SafeGet<TObject, TValue>(
        this TObject obj,
        Func<TObject, TValue> propertyAccessor)
    {
        return obj == null ? default(TValue) : propertyAccessor(obj);
    }

所以:

   Model.myCustomers.FirstOrDefault().SafeGet(m=>m.Name)
4

3 回答 3

2

集合或枚举不应该返回空值以获得最佳实践。

一旦确定 myCustomers 不为空,您只需检查 myCustomers 的第一项不为空。

var customer = Model.myCustomers.FirstOrDefault();
if (customer != null)
{
   var name = customer.Name;
}
于 2013-10-03T21:52:05.560 回答
1

如果您的收藏不是null,那么在您的 razon 视图中,您可以使用

 Model.myCustomers.Any() ? Model.myCustomers.First().Name : string.Empty;

如果由于某种原因你不能避免你的收藏为空,我想你可以做这样的事情。

 Model.myCustomers == null ? string.Empty : Model.myCustomers.Any() 
       ? Model.myCustomers.First().Name : string.Empty;
于 2013-10-03T22:03:14.137 回答
1

由于布局设计问题,我无法遍历所有属性。

我不太清楚这意味着什么,但你不能做这样的事情吗?

@if (Model.myCustomers == null || !Model.myCustomers.Any())
{
    <p>No customer found.</p>
}
@else
{
    [ put the markup for each property here ]
}
于 2013-10-03T21:55:16.880 回答