Я думаю, я должен уточнить, как работает модель компиляции. Прежде всего, вы можете написать все (включая код C #) в одном файле .ascx
и наследовать от любого класса, который вы хотите (который в конечном итоге наследует от UserControl
), указав атрибут Inherits
(или вы можете пропустить это) и без атрибута ClassName
. Если вы сделаете это, вы все равно сможете получить доступ к свойствам из файла .aspx
, который использует этот элемент управления. Дело в том, что вы не можете использовать класс в файле codebehind страницы .aspx
(если он есть) напрямую. Указав ClassName
, если вы используете модель проекта веб-сайта Visual Studio, вы также можете получить к нему доступ из файла .aspx.cs
. Обратите внимание, что это не будет работать в модели проекта веб-приложения, поскольку каждый файл .cs
будет скомпилирован раньше времени (до файла .ascx
). В этом случае даже атрибут ClassName
не сильно поможет.
В любом случае, строго ни один из атрибутов не является необходимым. Вы всегда можете использовать свойства, определенные в любом месте файла .ascx
или .ascx.cs
, включенного в страницу файла .aspx
(но , а не всегда .aspx.cs
файл).
Отредактируйте адрес для обновления на вопрос:
A) Судя по исходному коду, вы используете здесь модель веб-сайта. Обратите внимание, что я упоминал, что вы не можете использовать class напрямую. Я согласен с тем, что это утверждение могло вводить в заблуждение. Я хотел бы отметить, что без ClassName
ASP.NET выберет имя для вашего класса пользовательского элемента управления, но это имя не гарантируется. Хотя вы можете использовать сгенерированное имя, это вообще не рекомендуется. Вы должны относиться к нему как к анонимному типу, когда вы можете использовать экземпляр, но не можете упомянуть имя. В вашем примере вы в основном ссылаетесь на экземпляр (который построен на разметке .aspx
), а не на class , что в порядке.
Б) То, что вы говорите, правильно. Все, что вы объявите в ascx.cs
в веб-приложении, будет видно .aspx.cs
и .aspx
. Я говорил о свойствах, которые вы объявляете в .ascx
в теге <script runat="server">
. Они не будут видны .aspx.cs
, так как он скомпилирован заранее.
C) ASP.NET сгенерирует класс, определенный атрибутом ClassName
в пространстве имен ASP
. Вы должны использовать ASP.Some_Name
вместо этого. Я забыл упомянуть одну вещь: в этом случае вы должны как-то ссылаться на .ascx
в разметке .aspx
; либо с директивой Reference
(<%@ Reference Control="MyControl.ascx" %>
), либо с директивой Register
(<%@ Register TagPrefix="abc" TagName="xyz" Src="MyControl.ascx" %>
). Это гарантирует, что механизм сборки ASP.NET поместит сгенерированный класс .ascx
в ту же сборку, что и страница .aspx
.