Asp.net动态数据单页上的多个关系实体

时间:2013-01-22 05:46:21

标签: asp.net asp.net-dynamic-data

如何使用Asp.net动态数据从多个关系实体创建表单。

E.g。我有一个与地址主数据相关联的客户表。 (1 - > 0.1)

我想在创建和编辑客户时将这两个实体显示在一个页面上。

我怎样才能通过动态数据支架实现这一目标。

1 个答案:

答案 0 :(得分:1)

首先,您应该自定义 Insert.aspx Edit.aspx 页面模板How to: Customize the Layout of an Individual Table By Using a Custom Page Template,以便在其他自定义页面上放置(GridView或FormView)控件显示另一个实体。

下一步是以下步骤。考虑编辑客户的示例。

〜/ DynamicData / CustomPages / Customer / Edit.aspx (部分):

<%-- FormView with Customer entity --%>

<asp:FormView 
    ID="FormViewEditCustomer" 
    runat="server" 
    DataSourceID="EditCustomerDataSource" 
    DefaultMode="Edit"
    OnItemCommand="FormViewEditCustomer_ItemCommand"
    OnItemDeleted="FormViewEditCustomer_ItemDeleted" 
    RenderOuterTable="false">
    <EditItemTemplate>
        <table id="editTable" class="table-edit" cellpadding="6">
            <asp:DynamicEntity runat="server" Mode="Edit" />
        </table>
    </EditItemTemplate>
</asp:FormView>
<asp:EntityDataSource 
    ID="EditCustomerDataSource" 
    runat="server" 
    EnableUpdate="true" 
    EnableDelete="true" 
    OnUpdated="EditCustomerDataSource_Updated"
    OnSelected="EditCustomerDataSource_Selected"/>
<asp:QueryExtender 
    ID="EditCustomerQueryExtender"
    TargetControlID="EditCustomerDataSource" 
    runat="server">
    <asp:DynamicRouteExpression />
</asp:QueryExtender>
带有地址实体的

GridView - 带有QueryExtender和DynamicRouteExpression的版本1

<%-- GridView with Address entity - Version 1 with DynamicRouteExpression --%>

<asp:GridView 
    ID="GridViewAddress" 
    runat="server" 
    DataSourceID="AddressDataSource"
    AllowPaging="true" 
    AllowSorting="false" 
    PageSize="10" 
    CssClass="table-list" 
    AutoGenerateColumns="true">
</asp:GridView>
<asp:EntityDataSource 
    ID="AddressDataSource" 
    runat="server"
    ConnectionString="name=Entities" 
    DefaultContainerName="Entities"
    EntitySetName="Address" />
<asp:QueryExtender 
    ID="AddressQueryExtender" 
    TargetControlID="AddressDataSource"
    runat="server">
    <asp:DynamicRouteExpression ColumnName="Customer_Id" />
</asp:QueryExtender>

版本1 中,我们使用特殊类型的数据源表达式 DynamicRouteExpression 。在运行时,此对象从 URL 中提取主键列的值,并修改 AddressDataSource 生成的查询以包含适当的过滤条件。

必须注意的是,表格(实体)地址必须包含列名 Customer_Id (以及 NOT ,例如 Address_Customer_Id < / strong>),否则 GridViewAddress 将包含所有地址。


带有地址实体的

GridView - 带有CustomExpression和OnQuerying的QueryExtender的版本2 是功能更强大的版本

<%-- GridView with Address entity - Version 2 with QueryExtender with CustomExpression and OnQuerying --%>

<asp:GridView 
    ID="GridViewAddress" 
    runat="server" 
    DataSourceID="AddressDataSource"
    AllowPaging="true" 
    AllowSorting="false" 
    PageSize="10" 
    CssClass="table-list" 
    AutoGenerateColumns="true">
</asp:GridView>
<asp:EntityDataSource 
    ID="AddressDataSource" 
    runat="server"
    ConnectionString="name=Entities" 
    DefaultContainerName="Entities"
    EntitySetName="Address" />
<asp:QueryExtender 
    ID="AddressQueryExtender" 
    TargetControlID="AddressDataSource"
    runat="server">
    <asp:CustomExpression 
        OnQuerying="AddressQueryExtender_Querying" />
</asp:QueryExtender>

为了实施第2版,首先应使用 EditCustomerDataSource Selected 事件,以获得 Customer_Id EntityDataSourceSelectedEventArgs 选择的事件提供数据,然后我们可以使用 QueryExtender使用的 CustomExpression 控制。自定义表达式调用 AddressQueryExtender_Querying 方法,我们应该使用自定义LINQ表达式和过滤操作的结果(来自 EntityDataSourceSelectedEventArgs Customer_Id )将显示在 GridViewAddress

代码隐藏:

〜/ DynamicData / CustomPages / Customer / Edit.aspx.cs (部分):

protected int customerId;

protected void EditCustomerDataSource_Selected(object sender, EntityDataSourceSelectedEventArgs e)
{
    IEnumerable<Customer> customerItem = e.Results.Cast<Customer>();
    foreach (Customer c in customerItem)
    {
        customerId = c.Customer_Id;
    }
}

protected void AddressQueryExtender_Querying(object sender, System.Web.UI.WebControls.Expressions.CustomExpressionEventArgs e)
{
    e.Query = (from a in e.Query.Cast<Address>()
               where a.Customer_Id == customerId
               select a);
}

您可以从 ASP.NET动态数据释放一书中找到更详细的信息和解释。