绑定GridView的XML删除行时抛出System.NotSupportedException求助
解决GridView删除XML节点抛出System.NotSupportedException的问题
看起来你遇到的这个异常,大概率和数据源的读写权限、XML节点操作后的保存逻辑有关,咱们一步步拆解问题并解决:
可能的原因分析
这个System.NotSupportedException通常不是Linq to XML的Remove()方法本身的问题,而是以下几个常见场景导致:
- 绑定GridView的数据源是只读状态(比如用XmlDataSource但没开启删除权限)
- 删除节点后没有将修改保存回XML文件,导致数据源状态不一致
- 没有处理节点为
null的情况(虽然这会抛空引用,但如果数据源逻辑有问题也可能触发不支持的操作) - 应用程序对XML文件没有写入权限
修正后的完整代码方案
1. 完善Remove方法(增加保存+空值判断)
protected void Remove(string itemValue) { string xmlFilePath = Server.MapPath("~/ReportConfig.xml"); XDocument doc = XDocument.Load(xmlFilePath); // 先找到目标节点,避免null时调用Remove引发异常 var targetReport = doc.Descendants("Report") .Where(p => (string)p.Attribute("ID") == itemValue) .FirstOrDefault(); if (targetReport != null) { targetReport.Remove(); // 关键:必须将修改保存回XML文件,否则所有操作都是内存中的临时变更 doc.Save(xmlFilePath); } }
2. 确保GridView的删除按钮正确传递参数
检查你的GridView模板列中,删除按钮的CommandArgument是否正确绑定了Report的ID:
<asp:TemplateField HeaderText="操作"> <ItemTemplate> <asp:Button ID="btnDelete" runat="server" Text="删除" CommandName="Remove" CommandArgument='<%# Eval("ID") %>' /> </ItemTemplate> </asp:TemplateField>
3. 完整的RowCommand事件处理
protected void GridView1_OnRowCommand(object sender, GridViewCommandEventArgs e) { if (e.CommandName.Equals("Remove", StringComparison.OrdinalIgnoreCase)) { string reportId = e.CommandArgument.ToString(); Remove(reportId); // 删除后重新绑定GridView,刷新界面数据 GridView1.DataBind(); } }
额外的关键检查项
- XmlDataSource权限设置:如果你的GridView是绑定XmlDataSource控件,必须在控件属性里设置
EnableDelete="true",否则数据源会处于只读状态,触发不支持的操作异常。 - 文件写入权限:确保应用程序池的身份(比如IIS AppPool\你的应用池名称)对
ReportConfig.xml所在的文件夹有写入权限,否则保存XML时会抛出权限异常(也可能间接引发NotSupportedException)。
内容的提问来源于stack exchange,提问作者Amit Bhisikar
相关产品推荐
相关产品推荐

