ASP.NET MVC无数据库实现页面加载时填充1-20到ListBox及异常解决
嘿,我一眼就看出问题所在了——你遇到的System.NullReferenceException完全是因为视图里的Model根本没被赋值!你的Controller代码里虽然创建了NumberClass的实例,但既没把生成的选项列表赋值给它的numbers属性,也没把这个实例传给View,导致View渲染时Model是null,访问Model.numbers自然就报错了。
接下来一步步给你修正代码:
1. 修正Controller代码
你需要把生成的选项列表绑定到NumberClass的numbers属性,然后把这个实例传递给View。另外注意你要的是1到20,原来的循环是0到19,得调整一下:
public ActionResult Index() { List<SelectListItem> items = new List<SelectListItem>(); NumberClass num = new NumberClass(); // 循环从1开始,到20结束,生成1-20的选项 for(int i=1;i<=20;i++) { SelectListItem selectList = new SelectListItem() { Text = i.ToString(), Value = i.ToString() }; items.Add(selectList); } // 把选项列表赋值给NumberClass的numbers属性 num.numbers = items; // 将Model实例传递给View return View(num); }
2. 完善View代码
首先要在视图顶部指定模型类型,这样IntelliSense能正常工作,还能避免一些隐性错误。另外可以加个空值保护,防止意外情况:
@model NumberClass @using (Html.BeginForm()) { // 使用空合并运算符,当Model或Model.numbers为null时,返回空列表避免报错 @Html.ListBoxFor(m => m.Selectednumbers, Model?.numbers ?? new List<SelectListItem>()) }
关键要点总结
- 永远记得把Model实例传递给View,否则View里的
Model就是null - 要把数据正确绑定到Model的属性上,而不是只创建Model实例却不赋值
- 在视图顶部添加
@model声明,明确视图对应的模型类型,这是ASP.NET MVC的最佳实践 - 空值保护(比如
Model?.numbers ?? ...)能让代码更健壮,避免意外的空引用错误
内容的提问来源于stack exchange,提问作者user11280238
相关产品推荐
相关产品推荐

