You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#使用LINQ读取JSON时按钮章节ID计数异常问题如何修复

故障修复方案

故障根因说明

  1. 下一页跳转异常:StepView的全局索引变量未初始化,默认值始终为0,点击下一页直接从0递增到1,对应ID为2的内容,和用户选中的章节无关。
  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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 16:36:03