В Web.config Можно ли зарегистрировать все пользовательские элементы управления в указанном каталоге - PullRequest
5 голосов
/ 25 марта 2009

В настоящее время я регистрирую каждый пользовательский элемент управления отдельно в Web.config

<pages validateRequest="false">
  <controls>
    <add tagPrefix="cc1" src="~/Controls/MyUserControl1.ascx" tagName="MyUserControl1"/>
    ...    
    <add tagPrefix="cc1" src="~/Controls/MyUserControlN.ascx" tagName="MyUserControlN"/>
  </controls>
</pages>

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

Мне было интересно, можно ли просто указать весь каталог Controls и автоматически зарегистрировать все элементы управления там

Ответы [ 4 ]

8 голосов
/ 15 апреля 2009

Да и нет.

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

Так что, если вы никогда не собираетесь вкладывать пользовательские элементы управления, вам пора. НО, если вы хотите гибко вкладывать пользовательский контроль, у вас есть несколько вариантов:

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

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

Здесь есть дополнительная информация здесь и здесь. проверить комментарии к этому

1 голос
/ 15 апреля 2009

Создайте свой Web.Config из Global.asax:

protected void Application_Start(object sender, EventArgs e)
{

    Configuration config = WebConfigurationManager.OpenWebConfiguration("~/");
    PagesSection webSection = config.GetSection("system.web/pages") as PagesSection;

    List<TagPrefixInfo> toRemove = new List<TagPrefixInfo>();
    foreach (TagPrefixInfo info in webSection.Controls)
    {
        if (info.TagPrefix != "asp")
            toRemove.Add(info);
    }

    foreach (TagPrefixInfo list in toRemove)
    {
        webSection.Controls.Remove(list);
    }

    DirectoryInfo di = new DirectoryInfo(Server.MapPath("~/Controls"));
    foreach (FileInfo file in di.GetFiles("*.ascx"))
    {
        TagPrefixInfo newtag = new TagPrefixInfo("PREFIX", null, null, file.Name.Replace(".ascx",""), string.Concat("~/Controls/", file.Name));
        webSection.Controls.Add(newtag);

    }

    config.Save(ConfigurationSaveMode.Modified);
    ConfigurationManager.RefreshSection("system.web/pages");

}

... и все ваши записи появятся в web.config.

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

Насколько я знаю, в web.config это невозможно. Есть несколько обходных путей ... можно поместить ваши элементы управления в отдельный проект и скомпилировать их в одну сборку, на которую есть ссылка в web.config.

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

0 голосов
/ 14 декабря 2009

Вот VB.NET-адаптация решения @Jeff Fritz. Он делает то же самое, но включает в себя все элементы управления, расположенные в любом месте решения. (В нашей архитектуре используются модули, которые могут быть включены как внешние SVN, поэтому это очень хороший способ убедиться, что хост-приложение осведомлено о элементах управления всех модулей.)

    Sub RegisterUserControls()
        Dim Config As Configuration = WebConfigurationManager.OpenWebConfiguration("~/")
        Dim WebSection As PagesSection = TryCast(Config.GetSection("system.web/pages"), PagesSection)
        Dim ToRemove As List(Of TagPrefixInfo) = ( _
                From t As TagPrefixInfo In WebSection.Controls _
                Select t Where t.Source IsNot Nothing AndAlso t.Source.EndsWith(".ascx") _
            ).ToList
        For Each t As TagPrefixInfo In ToRemove
            WebSection.Controls.Remove(t)
        Next
        Dim SiteRoot As New DirectoryInfo(Server.MapPath("~"))
        For Each f As FileInfo In SiteRoot.GetFiles("*.ascx", SearchOption.AllDirectories)
            Dim Source As String = Path.Combine("~/", f.FullName.Replace(SiteRoot.FullName, "")).Replace("\", "/")
            Dim TagName As String = Path.GetFileNameWithoutExtension(f.Name)
            Dim NewTag As New TagPrefixInfo( _
                tagPrefix:="YOURPREFIX", _
                nameSpace:=Nothing, _
                assembly:=Nothing, _
                TagName:=TagName, _
                Source:=Source)
            WebSection.Controls.Add(NewTag)
        Next
        Config.Save(ConfigurationSaveMode.Modified)
        ConfigurationManager.RefreshSection("system.web/pages")
    End Sub

(Конечно, вы бы сослались на это в Application_Start, как это сделал Джефф.)

...