如何使用Asp.net动态数据从多个关系实体创建表单。
E.g。我有一个与地址主数据相关联的客户表。 (1 - > 0.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动态数据释放一书中找到更详细的信息和解释。