Пользовательский контроль ASP.NET - Неизвестный тег сервера

Я создал собственный элемент управления, который наследуется от элемента управления Literal. Когда я пытаюсь использовать мой элемент управления на странице, возникает ошибка синтаксического анализа. Я добавил это в свой web.config

<configuration>
  <system.web>
    <pages>
      <controls>
        <add tagPrefix="one" namespace="myApplication.Controls"/>
      </controls>
    </pages>
  </system.web>
</configuration>

И я добавил это на свою страницу

<%@ register namespace="myApplication.Controls" tagprefix="one" %>

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

- отредактировать

Вот код страницы.

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="SignUp.ascx.cs" Inherits="myApplication.Controls.SignUp" %>
<%@ register namespace="myApplication.Controls" tagprefix="one" %>
<div class="in">
    <span>      
        <one:resourceliteral id="lblFirstname" runat="server" resourcekey="FirstName" resourceresolver="ResourceStringResolver.GetResourceString">
        </one:resourceliteral>      
        </span>
    <div>
        <pl:textbox id="txtFirstName" runat="server"></pl:textbox>
    </div>
</div>

И вот код для моего фактического контроля

namespace myApplication.Controls
{
    public class ResourceLiteral : Literal
    {
        private ResourceManager rm;

        public delegate string dResourceResolver( string label, eLanguage language );

        public event dResourceResolver ResourceResolver;

        public string ResourceKey { get; set; }
        public object DataSource { get; set; }

        private eLanguage _Language = eLanguage.ENUS;
        public eLanguage Language
        {
            get { return _Language; }
            set { _Language = value; }
        }

        protected override void OnLoad(EventArgs e)
        {
            base.OnLoad(e);

            if (ResourceResolver != null)
                Text = ResourceResolver.Invoke( ResourceKey, _Language );
            else
            {
                if(rm != null)
                {
                    Text = rm.GetString( ResourceKey );
                }
            }
        }

        public void LoadDataSource(string resource)
        {
            rm = new ResourceManager( resource, Assembly.GetExecutingAssembly() );
        }

        public void LoadDataSource(Type resource)
        {
            rm = new ResourceManager( resource );
        }
    }
}

Ответ 1

При добавлении пространства имен, я нашел, что мне также нужна сборка. Если ваша сборка также myApplication делает это в web.config:

<add tagPrefix="one" namespace="myApplication.Controls" assembly="myApplication"/>

Затем просто очистите и перестройте, и все должно работать. Как только это находится в вашем web.config, вам не нужно добавлять его на свою страницу, если вы не используете это в элементе управления в том же каталоге, тогда вам понадобится ссылка в верхней части веб-формы. Но я рекомендую не использовать настраиваемые серверные элементы управления в том же каталоге, что и пользовательские элементы управления.

Ответ 2

Если я правильно вас понимаю, ваш контроль находится в рамках одного проекта?

Попробуйте зарегистрировать элемент управления в разметке вашей страницы со следующим:

<%@ Register Src="~/controls/foo.ascx" TagName="foo" TagPrefix="uc" %>

С помощью <uc:foo ID="foo1" runat="server"/> вы можете включить элемент управления в разметку. Если это не работает, ваш контроль, вероятно, не может быть скомпилирован. Прокомментируйте ненужные вещи и попробуйте еще раз.

Ответ 3

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

Хотя мой контрольный код компилировался без ошибок, оказалось, что были предупреждения, которые я игнорировал. Мои предупреждения касались файла ресурсов, который был в моей папке управления, которая ссылалась на другой отсутствующий файл. Как только я обратился к предупреждениям, тогда управление было скомпилировано правильно, и я смог использовать элемент управления только с директивой Register и без изменений в web.config, например:

<%@ Register TagPrefix="myPrefix" TagName="myControl" Src="~/controls/mySourceFile.ascx" %>

<myPrefix:myControl runat="server"></myPrefix:myControl>

Ответ 4

У меня также возникла проблема при публикации приложения ASP.NET Web Forms. Даже при копировании и вставке папки на сервер IIS, без публикации, подобные проблемы на страницах, которые использовали пользовательские элементы управления/пользовательские элементы управления, систематически выполнялись.

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

Чтобы устранить проблему при запуске процесса публикации/копирования и прошлого, вы должны перерегистрировать все пользовательские элементы управления пространствами имен и ассемблерами на каждой странице (.aspx), которая их использует:

<%@ Register TagPrefix="mycompany" Namespace="MyCompany.Web.Forms.Controls" Assembly="MyCompany.Web" %>
<%@ Register TagPrefix="mycomapny" Namespace="MyCompany.Web.Forms.Controls.ValidatorComponents"  Assembly="MyCompany.Web" %>

Обратите внимание, что это та же настройка для пользовательских элементов управления или пользовательских элементов управления. Эта проблема произошла даже в VS 2012, но все еще .NET 4.0. Этот процесс также необходим, если ваш код ASP.NET ссылается на такие элементы управления.