先日、MVC アプリケーションの一部を書き直したところ、「null 参照に対してランタイム バインディングを実行できません」という RuntimeBinderException が発生しました。
ViewBag 変数 AvailableDocuments をコントローラーのコレクション (Dictionary) に割り当て、ビューでそれを反復処理しています。最初のループは問題なく通過できますが、コードが2 番目の for ループの終了ポイントに到達すると、この例外がスローされます。これをいくつかの異なる方法で書き直しましたが、常に同じ問題に遭遇します。この例外を取り除く唯一の方法は、このビューから 2 番目または 3 番目のループを削除することです。また、デバッガーを使用して、コレクションで null 値を受け取っていないこと、および最初のループが (理由もなく) このコレクションに変更を加えていないことを確認しました。
@foreach (KeyValuePair<int, string> doc in ViewBag.AvailableDocuments)
{
<option value="@doc.Key" @((ViewBag.Product.Documents[0].OriginalDocID == doc.Key) ? "selected" : "")>@doc.Value</option>
}
これは、(3 つのドロップダウンを埋めるために) 3 回繰り返される for ループです。唯一変更されているのは、Documents のインデックス (null ではない) です。
Line 62: <select name="Doc1" style="width:300px;">
Line 63: <option value="-1">Don't Display a Document</option>
Line 64: @foreach (KeyValuePair<int, string> doc in ViewBag.AvailableDocuments)
<--改行
Line 65: {
Line 66: <option value="@doc.Key" @((ViewBag.Product.Documents[0].OriginalDocID == doc.Key) ? "selected" : "")>@doc.Value</option>
'
そしてメッセージ:
Exception Details: Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: Cannot perform runtime binding on a null reference