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)
您的代码中有两个问题:
考虑一下:
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.speakers为List<List<string>>并调用,.Add(speakers)而不是使用索引进行访问(您可能会得到索引超出范围)