1

先日、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

4

2 に答える 2

2

データベースまたは Web サービスから ViewBag.Product.Documents のデータを読み取っていますか? もしそうなら、遅延読み込みの問題に遭遇していると思います (データは必要になるまで要求されません)。データが要求されているときにソースが使用できなくなったため、例外が発生しています。

コード ビハインドで、割り当てに ToList() を追加し、問題が解決するかどうかを確認します。

ViewBag.Product.Documents = something.GetProductDocuments.ToList();
于 2013-01-15T16:01:13.537 に答える
1

必要なデータを使用して poco のコレクションを作成するとどうなるかは、次のように簡単です。

public class OptionItem
{
   public int Id {get; set;}
   public string Text {get; set;}
}

ビューモデルのコレクションに追加して、それをビューに渡しますか? このようにして、ビューに移動する前に、すべてのデータが自分のものであることを確認できます。個人的には、このような目的で viewbag を使用することは避けたいと思います。

于 2013-01-15T16:12:00.443 に答える