Asp.net動的データを使用して複数のリレーショナルエンティティからフォームを作成する方法。
たとえば、住所マスターに関連付けられた顧客テーブルがあります。(1-> 0.1)
顧客の作成と編集中に、これら両方のエンティティを1つのページに表示したいと思います。
動的データスキャフォールディングを使用してこれをどのように達成できますか。
Asp.net動的データを使用して複数のリレーショナルエンティティからフォームを作成する方法。
たとえば、住所マスターに関連付けられた顧客テーブルがあります。(1-> 0.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という本から、より詳細な情報と説明を見つけることができます。