0

Asp.net動的データを使用して複数のリレーショナルエンティティからフォームを作成する方法。

たとえば、住所マスターに関連付けられた顧客テーブルがあります。(1-> 0.1)

顧客の作成と編集中に、これら両方のエンティティを1つのページに表示したいと思います。

動的データスキャフォールディングを使用してこれをどのように達成できますか。

4

1 に答える 1

1

最初に、Insert.aspxおよびEdit.aspxページ テンプレートをカスタマイズする必要があります。方法: カスタム ページ テンプレートを使用して個々のテーブルのレイアウトをカスタマイズし、カスタム ページに追加の (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>

Addressエンティティを使用した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によって生成されたクエリを変更して、適切なフィルター条件を含めます。

テーブル (エンティティ) Addressには列名Customer_Idが含まれている必要があります (たとえば、Address_Customer_Idではありません)。そうでない場合、GridViewAddressにはすべてのアドレスが含まれます。


Addressエンティティを使用した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イベントを使用して、 Selectedイベントのデータを提供するEntityDataSourceSelectedEventArgsからCustomer_Idを取得します。次に、 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 Dynamic Data Unleashedという本から、より詳細な情報と説明を見つけることができます。

于 2013-04-08T15:47:35.247 に答える