適切なObjectDataSourceの使用
-
08-07-2019 - |
質問
ご挨拶!
GridViewコントロールにデータを表示するユーザーコントロールを作成しています。 n層アーキテクチャを使用しており、問題のデータはデータベースから取得され、ReadOnlyCollectionとして返されます。 OurNewObjectは、いくつかのプロパティとパラメーターを受け取らない空のコンストラクターを含むクラスです。次のネームスペースにあります:Acme.ObjectModel。
ユーザーコントロールには、次のものがあります:
<asp:GridView ID="ourGrid" runat="server" DataSourceID="ourDataSource">
<columns>
<asp:BoundField DataField="Name" HeaderText="Full Name" />
<asp:BoundField DataField="Gender" HeaderText="Gender" />
<asp:BoundField DataField="BirthYear" HeaderText="Year of Birth" />
<asp:BoundField DataField="JoinDate" HeaderText="Date Joined" />
</columns>
</asp:GridView>
<asp:ObjectDataSource ID="ourDataSource" runat="server" SelectMethod="GetTopUsers" TypeName="Acme.Model.OurNewObject">
</asp:ObjectDataSource>
ユーザーコントロールのコードビハインドには、次のパブリックメソッドがあります。
public ReadOnlyCollection<OurNewObject> GetTopUsers()
{
return (OurDataProxy.GetJustTheTopUsers());
}
ユーザーコントロールをWebフォームに配置して実行すると、次のメッセージが表示されます。
ObjectDataSource 'ourDataSource'は、パラメーターを持たない非ジェネリックメソッド 'GetTopUsers'を見つけることができませんでした。
だから私の質問は:
- ObjectDataSourceを使用していますか 間違っていますか?
- この状況でObjectDataSourceを使用するより適切な方法はありますか?
ありがとう。
解決
この問題には2つの属性が欠けていると思います。
最初にGetTopUsers()メソッドでこの属性を追加します
[System.ComponentModel.DataObjectMethodAttribute
(System.ComponentModel.DataObjectMethodType.Select, true)]
その後、実際のOurNewObjectクラスでこの属性を追加します
[System.ComponentModel.DataObject]
他のヒント
通常、メソッドをコードビハインドに配置するのではなく、データアクセスメソッドを含む別のオブジェクトを作成します。個別のオブジェクトはインスタンスまたは静的にすることができますが、オブジェクト自体にはパラメーターのないコンストラクターが必要です(コンストラクターはまったく必要ありません)。
また、ObjectDataSourceのTypeNameプロパティは、上記の個別のオブジェクトの型名を参照する必要があります。例:
public class SampleDataObject
{
public ICollection<OurNewObject> GetTopUsers()
{
//[...]
}
}
上記の属性: [System.ComponentModel.DataObject(true)]クラスレベル、および getterメソッドの[System.ComponentModel.DataObjectMethod(DataObjectMethodType.Select)]は必須ではありませんが、yerObjectDataSourceをフックするクラスを探すときに他の型を除外することにより、設計時のサポートに役立ちます。
DataViewNames
(主キーを追加)属性を GridView
に追加して、それが機能するかどうかを確認しますか?