У меня есть подпапка со страницей aspx и файлом web.config, который переопределяет строку подключения в файле web.config в корневом каталоге. Проблема заключается в том, что если страница aspx содержит какие-либо пользовательские элементы управления, пользовательские элементы управления по-прежнему получают строку подключения из файла web.config в корневом каталоге. Есть ли способ заставить их использовать web.config, который использует родительская страница aspx?
Переопределение Web.config не влияет на пользовательские элементы управления
Ответы (3)
Я предполагаю, что ваши пользовательские элементы управления находятся в корневом каталоге или в каталоге, в котором нет web.config, поэтому они используют корневой web.config. Причина проблемы вот в чем.
Для решения, я думаю, на вашей странице вы можете установить строку подключения для своих пользовательских элементов управления с помощью свойства. Или вы можете позволить своему пользователю управлять доступом к строке подключения через страницу с помощью метода.
Я предполагаю, что ваш пользователь контролирует некоторое место в реализации пользовательского элемента управления, читающего непосредственно из web.config. Однако это связывает информацию с пользовательским элементом управления, которая действительно имеет отношение к пользовательскому элементу управления. (информация о том, как получить строку подключения, а не саму строку подключения). Эта привязка нарушает принцип единой ответственности и (косвенно) является причиной вашей проблемы. Вместо чтения соединения внутри пользовательского элемента управления. Предоставьте строку подключения как свойство и установите ее на странице при создании экземпляра элемента управления.
Чтобы сделать еще один шаг к хорошему дизайну. ваш пользовательский элемент управления, вероятно, даже не должен знать о строке подключения, но вместо этого должен иметь рабочий класс или, что еще лучше, вы можете переписать, чтобы иметь элемент управления для целей отображения, рабочий для извлечения данных и механизм для привязки полученных данных к вам контроль.
Если это просто строка подключения (или всего несколько переменных настройки), вы можете просто передать их своему элементу управления с родительской страницы.
На вашей странице, содержащей проблемный пользовательский элемент управления, вы можете ссылаться на элемент управления на своей странице aspx, а затем при инициализации своей страницы aspx и ее элемента управления вы можете переопределить строку подключения в ее конструкторе/пользовательской функции.
На вашей странице aspx
<%Reference Src="path/to/your/control"%>
Сторона кода (aspx)
// - check if this works first
ASP.class_name_of_control_ascx(override_connection_string);
// Other wise - created place holder on page for control/find control on page
UserControl ctrl = new ASP.class_name_of_control_ascx();
PlaceHolderOnPage.Controls.Add(ctrl);
((ASP.class_name_of_control_ascx)ctrl).RunMethod(override_connection string);
А затем на стороне управления просто настройте конструктор по умолчанию и конструктор переопределения, чтобы принять строку подключения с родительской страницы aspx.
В вашем контроле вы просто использовали бы эту строку подключения переопределения.