假设我有两个类,一个派生自EntityObject
,另一个派生自第一个:
public class Gizmo : EntityObject { ... }
public class SpecialGizmo : Gizmo { ... }
在ASP.NET页面中,用户在列表中选择Gizmo(GridView
),然后Gizmo的详细信息将显示在DetailsView
中。目标是让用户能够查看并编辑详细信息。
以下是相关的DetailsView
及其关联的EntityDataSource
:
<asp:DetailsView ID="GizmosDetailsView" DataSourceID="dsGizmoDetails"
AutoGenerateEditButton="True" AutoGenerateInsertButton="True"
AutoGenerateRows="False" DataKeyNames="GizmoId" runat="server">
<Fields>
<asp:BoundField DataField="GizmoId" HeaderText="GizmoId" ReadOnly="True" SortExpression="GizmoId" />
<asp:BoundField DataField="Description" HeaderText="Description" SortExpression="Description" />
<!-- ... etc. --->
</Fields>
</asp:DetailsView>
<asp:EntityDataSource ID="dsGizmoDetails" runat="server" ConnectionString="[...]"
DefaultContainerName="[...]" EnableFlattening="False" EnableUpdate="True"
Where="it.[GizmoId] = @GizmoId">
<WhereParameters>
<asp:ControlParameter ControlID="gvwGizmos" Name="GizmoId" PropertyName="SelectedValue" Type="Int64" />
</WhereParameters>
</asp:EntityDataSource>
上述情况失败,但有以下异常:
InvalidOperationException:必须定义CommandText或EntitySetName。
这是可以理解的。然而,这两个选项都打破了一些东西:
如果我添加EntitySetName="Gizmo"
,则只会显示实际类型Gizmo
的实体。如果选择了SpecialGizmo
,则DetailsView将显示为空白。
如果我添加CommandText
(或Select
)属性,则DetailsView
不再支持更新数据。有一个正常工作的“编辑”按钮(可以显示编辑用户界面),但在编辑后单击“更新”却什么都不做。
这种困境是否有适当的解决方案?
答案 0 :(得分:1)
我使用以下hack解决了这个问题:
请在数据源上指定CommandText
,这会使DetailsView
无法自动更新数据,但更新用户界面仍然可用。
将DetailsView
的{{1}}事件设置为以下内容:
OnItemUpdating