MVC5 / C# - 无法对空引用执行运行时绑定

Dan*_*ris 7 c# runtime-error exception nullreferenceexception asp.net-mvc-5

我试图找出导致Cannot perform runtime binding on a null reference此代码错误的原因:

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++;
    }
}
Run Code Online (Sandbox Code Playgroud)

增量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++;
}
Run Code Online (Sandbox Code Playgroud)

Ofi*_*ris 5

您的代码中有两个问题:

考虑一下:

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

Cannot perform runtime binding on a null reference由于未定义扬声器(空引用),这段简化的代码会抛出异常。

您可以通过在循环之前speakers动态ViewBag 中定义来修复它:

ViewBag.speakers = new List<string>();
Run Code Online (Sandbox Code Playgroud)

第二期:

ViewBag.speakers[n] = speakers;
Run Code Online (Sandbox Code Playgroud)

代码中的发言者是一个列表,您可能希望定义ViewBag.speakersList<List<string>>并调用,.Add(speakers)而不是使用索引进行访问(您可能会得到索引超出范围