【发布时间】:2014-01-08 22:19:46
【问题描述】:
我意识到有人问过这个问题的变体,我已经在这里和其他地方尽职尽责地研究了几十个,但到目前为止我无法找到解决方案。希望我只是错过了一些东西,这个优秀社区中的某个人可以帮助我。我已经阅读并尝试了 Handling Null Data in Data Source Controls MSDN 文章,但也没有运气。
这是我的情况。我正在使用 EntityDataSource 和 SQL Server 数据库(如果这很重要),并且我有一个主表(我们称之为 Shipments),它通过外键引用各种子表。例如,Shipment 表点有一个引用 Truck 表的 Truck 列。
在创建货件时不需要卡车。如果用户稍后编辑货件以添加卡车,则一切正常。这是通过 GridView 模板字段中的 DropDownList 完成的,就像这样(对不起,我不知道如何漂亮地格式化这个 - 如果可以的话,我稍后会编辑帖子):
<asp:DropDownList ID="ddlTrucks" runat="server" AutoPostBack="false" AppendDataBoundItems="true"
DataTextField="Number" DataValueField="TruckID" DataSourceID="esrcTrucks"
SelectedValue='<%# Bind("TruckID") %>'>
<asp:ListItem Value="-1" Text="(Select)"></asp:ListItem>
</asp:DropDownList>
好的,如果在创建 Shipment 期间未输入 Truck(常见),DropDownList 会很好地填充“(Select)”作为选定项。
但是,如果一个 Shipment 引用了一辆卡车,并且该卡车后来被删除(假设它被毁坏并且不再是车队的一部分),那么我就会遇到问题并得到一个“ddlTruck 有一个无效的 SelectedValue因为它不存在于项目列表中。参数名称:值”错误消息。
最好我想阻止这个异常,这样它就不会发生。但是,如果我必须,有没有办法捕捉这个异常并“修复”DDL,以便可以显示页面并且用户可以继续他们的方式?我将如何/在哪里抓住这个?所以,我想我的问题是:
- 这是数据库设计问题吗?是否应该删除引用的
以我目前没有做的某种方式处理实体? - 有没有办法完全防止这种异常的发生, 就像没有输入卡车时一样(DDL 只显示 “(选择)”)?
- 如果我需要捕获和处理此异常,我将如何或在哪里做 是吗?
澄清一下,不要求 DDL 保留已删除卡车的数据。只需显示“Select”、空字符串或任何默认值即可。这样做的目的是不让页面崩溃,并且用户应该能够在需要时编辑货件的其他详细信息。
任何帮助将不胜感激。我已经在这上面花了几天时间,但一直没有任何工作!如果我可以提供更多信息,或者我在帖子中不清楚,请告诉我。
非常感谢!
【问题讨论】:
-
那么货物是否需要保留卡车不再存在的价值,还是应该更新?我假设您希望页面加载,然后用户将使用当前有效的选择更新该 DDL?这是正确的吗?
-
GridView/page 不要求保留之前的值。显示一个空字符串或其他一些默认值就可以了,因为这不是必填字段(在 GridView 或数据库表本身中)。
标签: asp.net gridview data-binding