Ошибка ASP.NET: страница Y.ascx не может использовать пользовательский элемент управления X.ascx

При попытке создать проект веб-сайта в Visual Studio 2010 я получаю сообщение об ошибке ниже:

Страница /WebSite/controls/C2.ascx не может использовать пользовательский элемент управления /WebSite/controls/C1.ascx, поскольку она зарегистрирована в web.config и находится в том же каталоге, что и страница. < / сильный>

У меня есть 2 веб-элемента управления:

controls/C1.ascx
controls/C2.ascx

Элементы управления зарегистрированы в web.config:

<configuration>
    <system.web>
        <pages>
            <controls>
                <add src="~/controls/C1.ascx" tagPrefix="my" tagName="C1"/>
                <add src="~/controls/C2.ascx" tagPrefix="my" tagName="C2"/>
            </controls>
        </pages>
    </system.web>
</configuration>

C1.ascx содержит только статический HTML, C2.ascx пытается включить C1:

C1.ascx содержит простой статический простой HTML. C2.ascx пытается включить C1.ascx:

<%@ Control Language="VB" %>
<my:C1 runat="server" />
<p>Hello from C2</p>

При попытке собрать проект я получаю сообщение об ошибке вверху. Я понимаю, что эту проблему можно решить, добавив еще одну директиву Register в C2.ascx ...:

<%@ Register Src="~/controls/C1.ascx" TagPrefix="ctl" TagName="C1" %>

... но мне интересно, есть ли более чистое решение и почему я вообще получаю ошибку?


person michalstanko    schedule 15.08.2011    source источник
comment
Есть ли причина, по которой ‹% @ Register ...%› считается нечистым? Кажется, ничем не отличается от использования операторов в верхней части файла .cs.   -  person mikemanne    schedule 15.08.2011
comment
Это считается нечистым только тогда, когда элемент управления уже зарегистрирован в web.config для каждой страницы или элемента управления веб-пользователя, что является моим случаем.   -  person michalstanko    schedule 19.08.2011


Ответы (2)


Ваши единственные возможные решения:

  • Переместите элемент управления из каталога, который в настоящее время используется совместно с external.ascx, или
  • Повторно зарегистрируйте элемент управления внутри external.ascx, как вы уже упомянули.
  • Перепишите их в коде как элементы управления в отдельной библиотеке

Я лично считаю, что переезд - это самый простой способ, если он будет работать с вашими решениями. Во-вторых, перерегистрация хоть и напрягает. Абстрагирование их в полную библиотеку кода, вероятно, не стоит усилий, если это единственная причина, по которой вы это делаете.

person Jon Adams    schedule 15.08.2011
comment
Повторная регистрация - лучший вариант для меня, я не хочу перемещать пользовательские элементы управления в другую подпапку только потому, что ASP.NET иногда ведет себя странно. Спасибо. - person michalstanko; 17.08.2011

Вы также можете поместить элементы управления в разные папки. Но я не думаю, что это намного чище или лучше.

Кстати: такое поведение является преднамеренным, как вы можете прочитать на эта страница MSDN (ищите желтую заметку почти в конце страницы).

person M4N    schedule 15.08.2011