是否可以为具有子类的实体对象提供可编辑的DetailsView?

时间:2012-01-31 14:12:34

标签: asp.net detailsview

假设我有两个类,一个派生自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不再支持更新数据。有一个正常工作的“编辑”按钮(可以显示编辑用户界面),但在编辑后单击“更新”却什么都不做。

这种困境是否有适当的解决方案?

1 个答案:

答案 0 :(得分:1)

我使用以下hack解决了这个问题:

  • 请在数据源上指定CommandText,这会使DetailsView无法自动更新数据,但更新用户界面仍然可用。

  • DetailsView的{​​{1}}事件设置为以下内容:

    OnItemUpdating

此解决方案的缺点: other controls on the page that rely on the data which is thusly updated, do not refresh until a manual page reload by the user.