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

ASP.NET修改JSON文件时新增条目而非更新原数据的问题求助

解决ASP.NET表单编辑JSON数据时新增而非更新的问题

我看了你的代码,问题很明确——你现在的提交逻辑是直接往书籍列表里新增一个Book对象,而不是找到原来的条目去更新它!

问题根源

在btnSubmit_editBook方法里,你用了这行代码:

catalogueInstance.books.Add(new Book(id, title, author, year, publisher, isbn));

Add()方法本身就是用来向集合中添加新元素的,所以每次点击提交都会新增一条,而不是修改原有数据。

修复方案

我们需要先找到要更新的那本书,然后修改它的属性,最后再序列化保存到JSON文件里。这里有两种实用的查找方式:

方式1:通过下拉框选中的索引查找(简单直接)

因为你是从下拉框选中的条目进入编辑流程的,提交时可以直接用选中索引定位到目标书籍:

protected void btnSubmit_editBook(object sender, EventArgs e)
{
    // 获取下拉框选中的索引
    int selectedIndex = ddlEdit.SelectedIndex;
    if (selectedIndex >= 0 && selectedIndex < catalogueInstance.books.Count)
    {
        // 找到要更新的书籍对象
        Book bookToUpdate = catalogueInstance.books[selectedIndex];
        
        // 更新对象的属性(ID一般不需要修改,跳过)
        bookToUpdate.title = txtTitle.Text;
        bookToUpdate.year = Int32.Parse(txtYear.Text);
        bookToUpdate.author = txtAuthor.Text;
        bookToUpdate.publisher = txtPublisher.Text;
        bookToUpdate.isbn = txtISBN.Text;
        
        // 序列化并保存到JSON文件
        string jsonText = JsonConvert.SerializeObject(catalogueInstance);
        File.WriteAllText(FILENAME, jsonText);
        
        txtSummary.Text = "Book ID of " + bookToUpdate.id + " Has Been Updated in the Catalogue" + Environment.NewLine;
    }
    else
    {
        txtSummary.Text = "No book selected to update!";
    }
}

方式2:通过ID查找(更灵活,适合ID唯一的场景)

如果你的书籍ID是唯一标识,也可以用LINQ精准定位对应ID的书籍:

protected void btnSubmit_editBook(object sender, EventArgs e)
{
    int id = Int32.Parse(txtID.Text);
    // 用LINQ查找对应ID的书籍
    Book bookToUpdate = catalogueInstance.books.FirstOrDefault(b => b.id == id);
    
    if (bookToUpdate != null)
    {
        // 更新属性
        bookToUpdate.title = txtTitle.Text;
        bookToUpdate.year = Int32.Parse(txtYear.Text);
        bookToUpdate.author = txtAuthor.Text;
        bookToUpdate.publisher = txtPublisher.Text;
        bookToUpdate.isbn = txtISBN.Text;
        
        // 保存修改到文件
        string jsonText = JsonConvert.SerializeObject(catalogueInstance);
        File.WriteAllText(FILENAME, jsonText);
        
        txtSummary.Text = "Book ID of " + id + " Has Been Updated in the Catalogue" + Environment.NewLine;
    }
    else
    {
        txtSummary.Text = "Book with ID " + id + " not found!";
    }
}

额外关键优化

记得给Page_Load加上!IsPostBack判断,否则每次回发都会重新绑定下拉框,导致选中状态丢失:

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack) // 仅在页面首次加载时执行绑定逻辑
    {
        string jsonText = File.ReadAllText(FILENAME);
        catalogueInstance = JsonConvert.DeserializeObject<Catalogue>(jsonText);
        ddlEdit.DataSource = catalogueInstance.books;
        ddlEdit.DataTextField = "title";
        ddlEdit.DataValueField = "id";
        ddlEdit.DataBind();
    }
}

另外,建议把Int32.Parse换成Int32.TryParse,避免用户输入非数字内容时抛出异常,增强页面健壮性。

内容的提问来源于stack exchange,提问作者Strato

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:52:41