2

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 クラスを扱うのは非常に難しいと言わざるを得ません....

4

1 に答える 1

3

同僚が私の問題の原因を見つけました。私の Web アプリの AddCommentPresenter クラスは、Web サイトの App_Code ディレクトリで定義されていました。何らかの理由で、それがエラーの原因でした。そこからウェブサイトのメインディレクトリに移動すると、コードが機能しました。これがコントロールの潜在的な落とし穴であるという ObjectDataSource ドキュメントでの言及を見つけることができませんが、そこに行きます。

また、クラスを App_Code フォルダーに保持することは可能であるとのことですが、TypeName の末尾に構文 ",__code" を含めます。例えば

TypeName="MyNamespace.MyType,__code" 

しかし、個人的には、試してみるとうまくいきませんでした。ASP.Net フォーラムへの別の投稿では、TypeName を次のように変更することが提案されました。

TypeName="_MyNamespace.MyType"

それも私にはうまくいきませんでした。結局、App_Code フォルダーからクラスを取り出しただけです。

于 2010-10-05T06:54:19.820 に答える