Пользовательский контроль в ASP.NET С#

Я создал простой пользовательский элемент управления, который наследует только элемент управления Literal и еще не имеет никаких расширений, код пуст.

Пространство имен: CustomControls

Имя класса: Literal: System.Web.UI.WebControls.Literal

Далее я регистрирую этот элемент управления на странице aspx следующим образом:

<%@ Register TagPrefix="web" Namespace="CustomControls" %>

(Я читал в нескольких учебниках, что это один из способов зарегистрировать его, помимо web.config и т.д.)

В конце концов, никакой интеллект для меня и, что еще хуже, я получаю ошибку синтаксического анализа "неизвестный тег сервера: web", когда я пытаюсь запустить страницу с элементом управления в ней.

Я использовал "создать новый проект", а не новый веб-сайт, если эта информация нужна.

Что может быть моей проблемой?

Спасибо заранее.

Ответ 1

Вот как я это сделал, шаг за шагом, начиная с ничего. Этот первый метод использует второй проект/сборку. Для версии App_code прокрутите вниз.

Метод веб-приложения

  • Создайте новое веб-приложение ASP.Net. Обратите внимание на это имя, мое название - WebApplication2. Если у вас уже есть существующее веб-приложение, которое, скорее всего, дважды щелкните по разделу свойств вашего проекта и проверьте свойство "Assembly Name", обратите внимание на него.
  • Создайте новый класс в веб-приложении с именем Literal.cs
  • Поставьте код, аналогичный приведенному ниже для ограничения класса:

    namespace CustomControls
    {
        public class Literal : System.Web.UI.WebControls.Literal
        {
        }
    }
    
  • Добавьте следующий тег реестра в начало страницы aspx

    <% @Регистрация сборки = "WebApplication2" Пространство имен = "CustomControls" tagprefix = "веб" % >

Если имя вашей сборки было другим, измените его здесь. Я заметил, что когда я это делал в VB.Net, пространство имен было WebApplication1.CustomControls, а не просто CustomControls, как это было в С#, что-то странное.

  • Добавьте новый элемент управления на свою страницу:

    < web: Literal ID = "Literal1" Runat = "Сервер" Текст = "тест" / >

Отдельный метод проекта

  • Создайте новый пустой веб-сайт (ASP.Net).
  • Добавьте в решение новую библиотеку управления ASP.Net Server с именем CustomControls.
  • Добавьте новый класс в новый проект Literal (я использую С#, поэтому мой файл называется Literal.cs). Ниже приведен мой супер базовый код, который, я считаю, должен соответствовать коду, описанному в вопросе.

    namespace CustomControls
    {
        public class Literal : System.Web.UI.WebControls.Literal
        {
        }
    }
    
  • Добавьте ссылку на проект CustomControls на свой веб-сайт.

  • Добавьте регистрацию сборки вверху страницы aspx:

    <% @Регистрация сборки = "CustomControls " Пространство имен = "CustomControls" tagprefix = "веб" % >

  • Добавьте новый экземпляр элемента управления на свою страницу:

    < web: Literal ID = "Literal1" Runat = "Сервер" Текст = "тест" / >

В методе App_Code

  • Создайте новый пустой веб-сайт (ASP.Net).
  • Добавить новый класс в папку App_Code Literal2 (я использую С#, поэтому мой файл называется Literal2.cs). Ниже мой супер базовый код, который, я считаю, должен соответствовать коду, описанному в вопросе. Я назвал его 2, чтобы вы могли использовать его в сочетании с описанным выше методом без ошибок компиляции.

    namespace CustomControls
    {
        public class Literal2 : System.Web.UI.WebControls.Literal
        {
        }
    }
    
  • Зарегистрируйте пространство сборки /names для app_code на странице aspx, добавив следующую строку в начало

    <% @Пространство имен в регистре = "CustomControls "Сборка =" __ Код " tagprefix = "веб" % >

  • Добавьте экземпляр нового элемента управления на свою страницу:

    < web: Literal2 ID = "literal2" Runat = "Сервер" Текст = "test2" / >

Я тестировал это с помощью визуальной студии, и все это отлично работало для меня.

Ответ 2

Вы также можете зарегистрировать свой элемент управления в web.config, если хотите использовать его на других страницах

<pages>
        <controls>
          <add tagPrefix="asp" namespace="System.Web.UI" assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
          <add tagPrefix="asp" namespace="System.Web.UI.WebControls" assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
          <add tagPrefix="web" namespace="MyProject.CustomControls" assembly="MyProject" />
        </controls>
      </pages>

Для веб-сайта это будет работать

<add tagPrefix ="web" namespace="ASP.App_Code.CustomControls" />

Ответ 3

Проблема заключается в тэге <%@ Register TagPrefix="web" Namespace="CustomControls" %>: он пропускает имя сборки!

Он должен стать <%@ Register TagPrefix="web" Namespace="CustomControls" Assembly="YourAssemblyName" %>. Если вам трудно найти имя сборки для своего класса, вот несколько советов:

  • Если вы создали класс внутри проекта веб-приложения Visual Studio или в отдельном проекте DLL (разделяемой библиотеки), щелкните его правой кнопкой мыши и перейдите в "Свойства", чтобы получить имя сборки
  • Если вы создали файл .cs в каталоге App_Code, ASP.App_Code должен работать

В противном случае, пожалуйста, дайте нам информацию о макете проекта!

Ответ 4

Самое простое - перетащить Literal.ascx на страницу (если страница находится в том же решении). Если страница является другим решением, вы можете добавить элемент управления в панель инструментов VS и перетащите элемент управления на страницу.

Ответ 5

Вы забыли атрибут src.

<%@ Register TagPrefix="web" Namespace="CustomControls" Src="PathToYourCustomControl" %>