无法找到ObjectDataSource的TypeName属性中指定的类型

时间:2013-12-02 12:51:00

标签: c# asp.net .net

由于要求,所有网站.cs文件都存储在App_Code目录中并编译为App_Code.dll。 当我尝试访问网站的某个特定页面时出错。

Description: An unhandled exception occurred during the execution
of the current web request. Please review the stack trace for more
information about the error and where it originated in the code. 

Exception Details: System.InvalidOperationException: The type
specified in the TypeName property of ObjectDataSource
'DataSourceSubmissionList' could not be found.

我有一个由ObjectDataSource填充的Gridview控件。代码如下:

/layouts/Portal/Company/Application/code.ascx:

<%@ Control Language="c#" AutoEventWireup="true"
CodeFile="~/layouts/Portal/Company/Application/code.ascx.cs"
Inherits="Project.WebUserControls.myapplications.sublayout" %>

<dx:ASPxGridView ID="ASPxGridView1"
  runat="server"
  DataSourceID="DataSourceSubmissionList"
  KeyFieldName="SubmissionId"
</dx:ASPxGridView>

<asp:ObjectDataSource
  ID="DataSourceSubmissionList"
  runat="server"
  TypeName="Project.WebUserControls.myapplications.sublayout">
</asp:ObjectDataSource>

/layouts/Portal/Company/Application/code.ascx.cs:

namespace Project.WebUserControls.myapplications
{  
    public partial class sublayout: System.Web.UI.UserControl 
    {
    }
}

当我在code.ascx文件中使用此行来获取完全限定的typename ...

<% Response.Write(typeof(Project.WebUserControls.myapplications.sublayout).AssemblyQualifiedName); %>

它会在页面上打印出来。

Project.WebUserControls.myapplications.sublayout, App_Web_oiftguk4,
Version=0.0.0.0, Culture=neutral, PublicKeyToken=null

但是,在ObjectDataSource TypeName中使用此确切类型(Project.WebUserControls.myapplications.sublayout)会导致错误。

我对此错误消息提出了很多疑问。我已经读过可能的解决方案可能是在TypeName属性like this中使用命名空间和程序集名称。但我无法做到这一点,因为代码是动态编译的,而程序集名称也在不断变化。

另一件事 - 只有在使用CodeFile方法时才会出现此错误。如果我切换到CodBehind,没问题。

这种行为可能是什么原因?

1 个答案:

答案 0 :(得分:20)

我通过在Page_Init期间初始化TypeName属性而不直接在ObjectDataSource中指定TypeName来解决了这个问题:

/layouts/Portal/Company/Application/code.ascx.cs:

public void Page_Init(object o, EventArgs e)
{
   DataSourceSubmissionList.TypeName = this.GetType().AssemblyQualifiedName;
}

/layouts/Portal/Company/Application/code.ascx:

<asp:ObjectDataSource
  ID="DataSourceSubmissionList"
  runat="server"
</asp:ObjectDataSource>