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
相关产品推荐
相关产品推荐

