Преобразование страницы в пользовательский элемент управления - PullRequest
2 голосов
/ 26 марта 2009

Если мы хотим преобразовать страницу в пользовательский элемент управления, мы также должны сделать следующее:

«Если вы не используете модель с выделенным кодом, убедитесь, что вы по-прежнему включаете имя класса в директиву Control, указав атрибут ClassName. Таким образом, веб-страница, которая использует элемент управления, может быть строго типизирована, что позволяет ей получать доступ к свойствам и методам, добавленным в элемент управления .. ”


Я не уверен, что понимаю приведенную выше цитату:

А именно, если мы не используем код за классом, то класс ascx будет производным напрямую от класса UserControl! Таким образом, если мы не будем использовать код, стоящий за классом, тогда к элементу управления не будет добавлено никаких методов или свойств, так почему у веб-страницы возникнут проблемы с доступом к каким-либо свойствам и методам пользовательского элемента управления? Так зачем нам включать имя класса в директиву Control?

1011 * спасибо *

Ответы [ 2 ]

2 голосов
/ 26 марта 2009

Я думаю, я должен уточнить, как работает модель компиляции. Прежде всего, вы можете написать все (включая код 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.

1 голос
/ 26 марта 2009

если мы не используем код за классом, тогда не будет никаких методов или свойства добавлены в элемент управления, так почему будут ли проблемы с доступом к веб-странице любые свойства пользовательского элемента управления и методы? Так зачем нам включить имя класса в элемент управления Директива

  1. Вы можете встроить любой код за кодом в ваш файл .ascx / .aspx, в новой модели asp.net mvc код по умолчанию не будет. Я думаю, что код позади является необязательным, это просто хороший способ разделить один класс на две части. Частичный класс используется в коде позади.
  2. Даже если вы не используете код за классом, вы все равно можете унаследовать свойства от базового элемента управления. Затем, объявив класс, вы также сможете получить доступ к этим свойствам.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...