1. ホーム
  2. その他

[解決済み】MVC5 / C# - ヌル参照で実行時バインディングを実行できない。

2022-01-21 13:34:31

質問

が表示される原因を調べています。 var query = "SELECT Id, UserName, List_Order, LoggedIn " + "FROM AspNetUsers" + "WHERE LoggedIn = 1" + "ORDER BY List_Order ASC"; var conn = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString); var cmd = new SqlCommand(query, conn); conn.Open(); var rdr = cmd.ExecuteReader(); var n = 0; while(rdr.Read()) { if (Convert.ToString(rdr["UserName"]) != null) { ViewBag.speakers[n] = new string[4] { Convert.ToString(rdr["Id"]), Convert.ToString(rdr["UserName"]), Convert.ToString(rdr["List_Order"]), Convert.ToString(rdr["LoggedIn"]) }; //Exception Details: Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: Cannot //perform runtime binding on a null reference n++; } } というエラーが発生します。

Cannot perform runtime binding on a null reference

n++ のインクリメントがこのエラーの原因になっているようですが、理由がわかりません。

可能な解決策を反映させるためにコードを更新しました。しかし、エラーはまだ残っています。

試してみましたが、同じ結果でした。

if (!string.IsNullOrWhiteSpace(Convert.ToString(rdr["UserName"]))) {
        List<string> speakers = new List<string>();
        speakers.Add(Convert.ToString(rdr["Id"]));
        speakers.Add(Convert.ToString(rdr["UserName"]));
        speakers.Add(Convert.ToString(rdr["List_Order"]));
        speakers.Add(Convert.ToString(rdr["LoggedIn"]));

        ViewBag.speakers[n] = speakers;
        n++;
}

解決方法は?

あなたのコードには2つの問題があります。

これを検討します。

public ActionResult Index()
{
   int n = 0;
   ViewBag.speakers[n] = 5;
   return View();
}

この単純化されたコードでは Cannot perform runtime binding on a null reference speakers が定義されていない (null リファレンス) ためです。

を定義することで修正できます。 speakers の中で ダイナミック ループの前のViewBag。

ViewBag.speakers = new List<string>();

2つ目の課題

ViewBag.speakers[n] = speakers;

のスピーカーがリストである場合、そのスピーカーに ViewBag.speakers として List<List<string>> を呼び出し .Add(speakers) インデックスを使用してアクセスするのではなく(例えば index was out of range )