Insert メソッドが呼び出されたときに「オブジェクトがターゲットの型と一致しません」というエラーが発生しているページに ObjectDataSource があります。このメッセージをグーグルで調べたところ、このメッセージは欺瞞的であり、ObjectDataSource がメソッドを呼び出そうとしているオブジェクトで実際に null 参照エラーが発生していると思いますが、その理由を理解できれば大変です。
<asp:ObjectDataSource ID="dsAddComment" runat="server"
DataObjectTypeName="BookCatalogue.InteractionDocuments.UserComment"
SelectMethod="GetNewComment" TypeName="BookCatalogue.AddCommentPresenter"
InsertMethod="AddComment" OnObjectCreating="dsAddComment_ObjectCreating" />
Insert 時に呼び出される Type は AddCommentPresenter です。メソッド AddComment は静的ではありません。これを静的に変更すると、エラーは発生せず、メソッドは問題なく見つかります。静的でない場合、エラーが発生します。そのため、根本的な問題は、AddComment メソッドが呼び出されたときに、Presenter クラスの有効なインスタンスを何らかの形で取得していないことにあると思います。
私の AddCommentPresenter クラスには、パラメーターなしのコンストラクターがありません。通常はエラーになります。これを回避するために、ページのコード ビハインドで ObjectCreating イベントをオーバーライドし、Presenter クラスのインスタンスを割り当てています。
protected void dsAddComment_ObjectCreating(object sender, ObjectDataSourceEventArgs e)
{
e.ObjectInstance = presenter;
}
ObjectCreating メソッドをステップ実行できます。これは、e.ObjectInstance プロパティに渡される有効な null 以外の Presenter インスタンスです。
私の AddComment メソッドには正しい署名があります。
public void AddComment(UserComment newComment)
{
...
}
aspx ページの型名のスペルミスなど、明らかなことも確認しましたが、すべて正しいです。
誰にもアイデアはありますか?ObjectDataSource クラスを扱うのは非常に難しいと言わざるを得ません....