2011-10-24 7 views
2

特定の配列変数が設定されているかどうかに基づいて条件付きロジックを持ついくつかのRazorコードがあります。私はそれがnullであり、私のkludgyソリューションに満足していないときに対処する最善の方法を考え出す時間がある。Razorコードでnull変数の可能性を処理する方法は?

ここで何が起こっているかの簡単な例です:

@{ 
    if (ViewBag.Foo != null) 
    { 
     double[] bar = new double[ViewBag.Foo.Length]; 
    } 
} 

後でコードで、私はこのようなものがあります:そのコードで

@if (ViewBag.Foo != null) 
{ 
    ...some code that uses `bar` goes here ... 
} 

を実際にするときViewBag.Foo、私はエラーを取得します無効である。 barを使用するコードの2番目のセクションについて不平を表示し、スコープに含まれない例外が発生します。ただし、実行時には、その2番目のセクションは常にスキップされます。

しばらくの間、それをいじりの後、私は代わりにこれをした:ViewBag.Fooがnullとnullでない場合は、この変更に伴い

double[] bar; 
@{ 
    if (ViewBag.Foo != null) 
    { 
     bar = new double[ViewBag.Foo.Length]; 
    } 
} 
else 
{ 
    bar = new double[1]; 
} 

を、コードが動作します。これを処理するにはより良い方法が必要です...誰ですか?

+0

あなたのケースでは、ViewBag.Fooは実際には存在しません(動的なタイプなので、コードはうまく動作します)。ViewBag.Fooは存在しますか?もしそうでなければ、読んでください:http://stackoverflow.com/questions/2634858/how-do-i-reflect-over-the-members-of-dynamic-object – Polity

+0

私が言っているのは...これは正確に理由です。最初に動的言語を避けると仮定します。明確なモデルでカスタムビューを作成することを検討しましたか? –

答えて

4

この種の仕事は、ビューに属していません:

@{ 
    if (ViewBag.Foo != null) 
    { 
     double[] bar = new double[ViewBag.Foo.Length]; 
    } 
} 

このような場合は正確になぜあなたが持っていた問題の一種です。あなたの問題は、barが正しくスコープされていなかったという事実になりました。代わりに、この作業がViewModel内で失敗した場合、同様の間違いがすぐにコンパイラエラーを引き起こしていました。代わりに、アプリケーションをコンパイルして使用するまではわかりません。与えられたエラーは、わかりにくく、追跡が難しい場合があります。

+0

このコードのより良いアプローチは何ですか?代わりにコントローラーにすべきでしょうか? – TMC

+0

Foo'sとBarの話は、私にとってあなたに明確な答えを与えるのは本当に難しいです。最終的には、あなたがやっているマッサージの複雑さになります。それが本当にシンプルならば、ViewModelのコンストラクタまたはおそらくコントローラで行うことができます。 個人的には、私が通常行うことは、アプリケーションの各ビューに対してViewModelを持たせることです。このビューモデルは、ビュー内のフィールドごとにプロパティを持つ単なるPOCOです。次に、ViewModelごとにModelFactoryを用意して、必要なデータを取得して適切なプロパティを設定する作業を行います。これが私がそれをやっているところです。 –

0

あなた自身の問題を解決しました。

bar変数は、ifブロック内で宣言したため、有効範囲にありませんでした。あなたの変化はそれを広げた。

関連する問題