2013-01-22 2 views
0

Как создать форму из нескольких реляционных сущностей с динамическими данными Asp.net.Asp.net Динамические данные нескольких реляционных объектов на одной странице

E.g. У меня есть таблица клиентов, связанная с мастером адреса. (1 -> 0,1)

Я хочу показать обе эти объекты на одной странице при создании и редактировании клиента.

Как я могу достичь этого с помощью динамических лесных лесов.

ответ

1

Прежде всего, вы должны настроить 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.

Смежные вопросы