Прежде всего, вы должны настроить Insert.aspx и Edit.aspx Шаблоны страниц How to: Customize the Layout of an Individual Table By Using a Custom Page Template для того, чтобы разместить на пользовательской странице дополнительные (GridView или FormView) управления для отображения другого лица.
Следующий шаг следующий. Рассмотрим пример редактирования клиента.
~/DynamicData/CustomPages/Клиент/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 с Адрес сущность - Version 1 с QueryExtender и DynamicRouteExpression
<%-- 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 (и НЕ, например Address_Customer_Id), в противном случае GridViewAddress будет включать в себя все адреса.
GridView с Адрес сущность - Version 2 с QueryExtender с CustomExpression и OnQuerying более мощная версия
<%-- 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>
Для реализации Version 2 мы должны использовать, первый из всех, Выбранные события EditCustomerDataSource для того, чтобы получить customer_id от EntityDataSourceSelectedEventArgs, что обеспечивает данные для события Selected, то мы можем использовать CustomExpression, который используется в управления QueryExtender.Обычай выражение вызывает метод AddressQueryExtender_Querying, где мы должны использовать выражение пользовательских LINQ и результаты операции фильтрации (по customer_id из EntityDataSourceSelectedEventArgs) будет отображаться в GridViewAddress.
Code-за:
~/DynamicData/CustomPages/Клиент/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.