1

MVC3、Razor、C# を使用しています。

LINQ を含むいくつかの Razor コードがあります。リストから値を取得しようとします。List が null の場合もあります。現在、アプリケーションはこれが原因で null 例外を発生させています。つまり、「myCustomers」が null です。

コード:

Model.myCustomers.First().Name

基本的に「myCustomers」は次のように定義されます。

public List<Customer> myCustomers

また、「LINQ to Entity」クエリによって入力されます。

「myCustomers」が null の場合、かみそりコードがクラッシュしないようにするにはどうすればよいですか。プロパティごとに「if (Name!=null)」タイプのブロックをたくさん書きたくない。レイアウト設計の問題により、すべてのプロパティを反復処理することはできません。だから私は変更する必要があります:

Model.myCustomers.First().Name

何らかの方法で。

この質問があまり混乱しないことを願っています!

よろしくお願いします。

編集1

null を返さず、空のリストを返すというロジックが気に入っています。私は次のようなものを使用してみました

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

「IF」ブロックではなく、Razor ページの LINQ の 1 行で空であることを何らかの方法でテストすることが理想的です。

編集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

Collection または enumable は、ベスト プラクティスとして null 値を返すべきではありません。

myCustomers が null でないことを確認したら、myCustomers の最初の項目が null でないことを確認するだけで済みます。

var customer = Model.myCustomers.FirstOrDefault();
if (customer != null)
{
   var name = customer.Name;
}
于 2013-10-03T21:52:05.560 に答える
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 に答える
1

コレクションが でない場合nullは、razon ビューで使用できます

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

何らかの理由でコレクションが null になることを避けられない場合は、このようなことができると思います。

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