如何处理Model[9]的索引越界异常与空值异常?
解决索引越界与空值异常问题
咱们直接拆解你遇到的两个核心问题:索引越界错误和Model[9]的空值异常,一步步来搞定:
1. 为什么会触发索引越界?
你提到模型对应10个类,但报错明确显示索引超出范围——这说明你的Model集合实际元素数量不足10个。记住C#集合索引从0开始,Model[9]对应第10个元素,只要集合Count小于10,访问这个索引必然抛出异常。
先快速排查集合实际大小:在视图开头加一行调试代码(上线前记得删掉):
@{ var modelCount = Model?.Count() ?? 0; <p>当前Model集合元素数量:@modelCount</p> }
如果数量确实小于10,得先去控制器里查原因——是不是数据查询漏了元素,或者集合初始化时没创建足够实例?
2. 安全访问的解决方案
不管是集合元素不足,还是Model[9]本身为null,我们都可以通过安全访问逻辑避免异常,同时给用户友好的默认值。
方案一:条件判断+空安全运算符
修改视图代码,先判断集合有效性,再处理空值:
<div class="small-box bg-blue"> <div class="inner"> @if (Model != null && Model.Count() > 9) { var targetItem = Model[9]; <h3>@(targetItem?.status ?? "N/A")<sup style="font-size: 20px"></sup></h3> <p>N-7 NEW ST SR @(GetSafeDeviceIdSegment(targetItem?.deviceid))</p> } else { <h3>N/A<sup style="font-size: 20px"></sup></h3> <p>N-7 NEW ST SR Unknown</p> } </div> <div class="icon">...</div> </div> @functions { // 抽离方法处理deviceid的子串逻辑,更清晰 private string GetSafeDeviceIdSegment(string deviceId) { if (string.IsNullOrEmpty(deviceId) || deviceId.Length < 16) return "Unknown"; return deviceId.ToUpper().Substring(11, 5); } }
这里做了这些防护:
- 先校验
Model不为空且元素足够,才访问Model[9] - 用
?.空条件运算符安全访问属性,避免空引用异常 - 用
??空合并运算符给空值兜底默认值 - 单独抽离方法处理
deviceid的子串逻辑,避免Substring因长度不足抛异常
方案二:用LINQ的ElementAtOrDefault简化逻辑
如果你的Model是IEnumerable类型,直接用ElementAtOrDefault安全获取元素——索引越界时它会返回null:
<div class="small-box bg-blue"> <div class="inner"> @{ var targetItem = Model?.ElementAtOrDefault(9); } <h3>@(targetItem?.status ?? "N/A")<sup style="font-size: 20px"></sup></h3> <p>N-7 NEW ST SR @(GetSafeDeviceIdSegment(targetItem?.deviceid))</p> </div> <div class="icon">...</div> </div> @functions { private string GetSafeDeviceIdSegment(string deviceId) { if (string.IsNullOrEmpty(deviceId) || deviceId.Length < 16) return "Unknown"; return deviceId.ToUpper().Substring(11, 5); } }
这个方案更简洁,不用手动判断集合长度,ElementAtOrDefault会帮你处理索引越界的情况。
内容的提问来源于stack exchange,提问作者krishna mohan
相关产品推荐
相关产品推荐

