C#使用LINQ读取JSON时按钮章节ID计数异常问题如何修复
故障修复方案
故障根因说明
- 下一页跳转异常:StepView的全局索引变量未初始化,默认值始终为0,点击下一页直接从0递增到1,对应ID为2的内容,和用户选中的章节无关。
- 空引用异常:存在两个问题,一是Content领域类未定义JSON中存在的
navTitle属性,反序列化后该属性不存在;二是返回按钮的边界判断逻辑错误,混淆了业务IDcontentid和列表索引,会出现索引为负的情况,拿到null的内容对象后访问属性触发异常。
修复步骤与代码
1. 补全Content领域类的缺失属性
首先给Content类添加JSON中存在的navTitle字段映射:
public partial class Content { [JsonProperty("contentid")] public long Contentid { get; set; } [JsonProperty("chapterTitle", NullValueHandling = NullValueHandling.Ignore)] public string ChapterTitle { get; set; } // 新增NavTitle属性映射 [JsonProperty("navTitle")] public string NavTitle { get; set; } [JsonProperty("text")] public string Text { get; set; } }
2. 修改章节选中事件,传递真实选中索引
计算用户选中章节在内容列表中的实际索引,传给StepView初始化:
public void Handle_ItemTapped(object sender, ItemTappedEventArgs e) { var tappedStep = (Content)MyListView.SelectedItem; // 计算选中内容的真实列表索引 int stepIndex = _protocol.Contents.FindIndex(c => c.Contentid == tappedStep.Contentid); Navigation.PushAsync(new StepView(_protocol, Title, stepIndex)); ((ListView)sender).SelectedItem = null; }
3. 重写StepView类逻辑,修复边界判断与索引初始化
public partial class StepView : ContentPage { private Protocol _protocol; // 存储当前浏览的内容索引 private int _currentIndex; // 构造函数直接接收选中索引初始化 public StepView(Protocol protocol, string title, int selectedIndex) { _protocol = protocol; _currentIndex = selectedIndex; InitializeComponent(); // 初始化当前页内容 var currentContent = _protocol.Contents[_currentIndex]; lblText.Text = currentContent.Text; Title = $"{title} - {currentContent.NavTitle}"; // 初始化上下页按钮状态 BtnBack.IsEnabled = _currentIndex > 0; BtnNext.IsEnabled = _currentIndex < _protocol.Contents.Count - 1; } public void BtnBack_Clicked(object sender, EventArgs e) { // 先做边界判断再修改索引,避免越界 if (_currentIndex <= 0) return; _currentIndex--; var content = _protocol.Contents[_currentIndex]; UpdatePage(content); BtnNext.IsEnabled = true; BtnBack.IsEnabled = _currentIndex > 0; } public void BtnNext_Clicked(object sender, EventArgs e) { // 先做边界判断再修改索引,避免越界 if (_currentIndex >= _protocol.Contents.Count - 1) return; _currentIndex++; var content = _protocol.Contents[_currentIndex]; UpdatePage(content); BtnBack.IsEnabled = true; BtnNext.IsEnabled = _currentIndex < _protocol.Contents.Count - 1; } // 统一更新页面内容,提前做空判断避免空引用 private void UpdatePage(Content content) { if (content == null) return; lblText.Text = content.Text; Title = $"{_protocol.Name} - {content.NavTitle}"; } public void btnHome_Clicked(object sender, EventArgs e) { Navigation.PushAsync(new MainPage()); } }
内容的提问来源于stack exchange,提问作者Teun
相关产品推荐
相关产品推荐

