2

我的页面上有一个 ObjectDataSource,它在调用其 Insert 方法时产生错误“对象与目标类型不匹配”。从谷歌搜索这条消息,我相信这条消息是欺骗性的,我实际上在 ObjectDataSource 试图调用该方法的对象上得到一个空引用错误,但如果我能找出原因,我会很生气。

<asp:ObjectDataSource ID="dsAddComment" runat="server"  
     DataObjectTypeName="BookCatalogue.InteractionDocuments.UserComment"
     SelectMethod="GetNewComment" TypeName="BookCatalogue.AddCommentPresenter"
     InsertMethod="AddComment"  OnObjectCreating="dsAddComment_ObjectCreating" />

插入时调用的类型是 AddCommentPresenter。AddComment 方法不是静态的。如果我将其更改为静态,我不会收到错误,并且找到该方法没有问题。当它不是静态的时,就会发生错误。这就是为什么我认为根本问题是,当调用 AddComment 方法时,不知何故我没有获得我的 Presenter 类的有效实例。

我的 AddCommentPresenter 类没有无参数构造函数。这通常会导致错误。为了解决这个问题,我在页面的代码隐藏中覆盖了 ObjectCreating 事件并分配了 Presenter 类的实例。

protected void dsAddComment_ObjectCreating(object sender, ObjectDataSourceEventArgs e) { e.ObjectInstance = presenter; }

我可以逐步执行我的 ObjectCreating 方法,它是一个有效的、非空的 Presenter 实例,它被传递到 e.ObjectInstance 属性中。

我的 AddComment 方法具有正确的签名。

    public void AddComment(UserComment newComment)
    {
        ...
    }

我还检查了一些明显的事情,比如在 aspx 页面上拼错了类型名称,但那里一切都是正确的。

有人有想法么?我必须说我发现 ObjectDataSource 类很难使用......

4

1 回答 1

3

一位同事找到了我的问题的原因。我的 Web 应用程序中的 AddCommentPresenter 类是在网站的 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 回答