ASP.NET Custom Control - неизвестный тег сервера - PullRequest
42 голосов
/ 06 января 2010

Я создал пользовательский элемент управления, который наследуется от элемента управления 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 );
        }
    }
}

Ответы [ 4 ]

77 голосов
/ 06 января 2010

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

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

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

2 голосов
/ 06 апреля 2015

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

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

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

<myPrefix:myControl runat="server"></myPrefix:myControl>
1 голос
/ 10 сентября 2013

У меня также была эта проблема при публикации моего приложения 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 для таких элементов управления.

1 голос
/ 06 января 2010

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

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

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

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

...