2013-12-02 2 views
6

Из-за требований все файлы веб-сайта .cs хранятся в каталоге App_Code и скомпилированы в App_Code.dll. При попытке доступа к одной конкретной странице веб-сайта возникает ошибка.Тип, указанный в свойстве TypeName объекта ObjectDataSource не найден

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. 

У меня есть элемент управления Gridview, который заполняется ObjectDataSource. Код ниже:

/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, чтобы получить полное имя типа ...

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

Он печатает это на странице.

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

Однако, используя этот точный тип (Project.WebUserControls.myapplications.sublayout) в ObjectDataSource TypeName приводит к ошибке.

У меня возникло много вопросов об этом сообщении об ошибке. Я прочитал, что возможным решением может быть использование как пространства имен, так и имени сборки в свойстве TypeName, like this. Но я не могу этого сделать, потому что код скомпилирован динамически и имя сборки продолжает меняться.

Другое дело - эта ошибка возникает только при использовании подхода CodeFile. Если я переключусь на CodBehind, никаких проблем.

В чем причина такого поведения?

+0

Почему * все * .c s файлов, скомпилированных в App_Code, и есть ли способ изменить это? – Alden

+0

Уточнение, все .cs-файлы скомпилированы в App_Code.dll. Файлы Ascx.cs не скомпилированы в dll. Когда развертывание происходит, папка и макеты App_Code (.ascx + ascx.cs) развертываются на сервере. Зачем? Потому что это требование, и я не могу ничего с этим поделать как разработчик. – afaf12

ответ

17

Я решил проблему инициализации TypeName имущества во Page_Init и не уточняя TypeName непосредственно в ObjectDataSource:

/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> 
Смежные вопросы