.Net ObjectDataSource错误:对象与目标类型不匹配

时间:2010-10-01 02:30:34

标签: asp.net data-binding objectdatasource 2-way-object-databinding

我在调用其Insert方法时产生错误“Object与目标类型不匹配”的页面上有一个ObjectDataSource。从谷歌搜索这条消息,我相信这个消息具有欺骗性,我实际上在ObjectDataSource试图调用该方法的对象上得到一个空引用错误,但是如果我能弄明白为什么我就知道了。

<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方法,它是一个有效的非null Presenter实例,它被传递到e.ObjectInstance属性中。

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

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

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

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

1 个答案:

答案 0 :(得分:3)

一位同事找到了我的问题的原因。我的Web应用程序中的AddCommentPresenter类是在网站的App_Code目录中定义的。出于某种原因,这导致了错误。将它移出那里,进入网站的主目录,代码工作。我在任何ObjectDataSource文档中都找不到任何提及这是控件的潜在问题,但是你去了。

我还被告知应该可以将该类保留在App_Code文件夹中,但在TypeName的末尾包含语法“,__ code”。例如。

TypeName="MyNamespace.MyType,__code" 

但就个人而言,当我尝试时,我没有那么努力。 ASP.Net论坛的另一篇帖子建议将TypeName更改为

TypeName="_MyNamespace.MyType"

这对我也不起作用。我最终只是将该类从App_Code文件夹中拉出来。