Возможно ли иметь классический asp.net динамически загружать подтипы объявленных веб-контролей - PullRequest
0 голосов
/ 03 февраля 2012

Я хочу иметь возможность декларативно указывать веб-элементы управления любой заданной страницы стандартным способом, , но имеют во время выполнения не обязательно новые экземпляры указанных типов, а скорее, например, проверку по сети.config, следует ли использовать вместо этого другой веб-элемент управления (который наследуется от указанного).

например, я мог бы иметь веб-контроль по пути /templates/controls/default/PersonSelector.ascx и другой впуть /templates/controls/CUSTOMER_A/PersonSelector.ascx (унаследованный от первого)

, поэтому, если моя конфигурация указывает, что я предпочитаю загружать элементы управления из папки CUSTOMER_A, где она доступна, и так как она будет доступна в этомВ этом случае фактическая разметка, которая использовалась для страницы, будет получена из ... / CUSTOMER_A / PersonSelector.ascx.Весь код, который во время компиляции предполагал, что он на самом деле является экземпляром ../default/PersonSelector.ascx, все равно будет работать, так как он на самом деле является подклассом.

Это было бы на самом деле основным преимуществом для нашего сайта, которыйэто мультитенантный сайт, в котором 99,5% сгенерированного html одинаково для всех наших клиентов (за исключением скиннинга, естественно), но некоторым клиентов нужны разные заголовки / нижние колонтитулы / логика выбора и т. д. Пока что всеРазличия обрабатываются путем вздутия элементов управления и, если / иначе, повсюду.

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

1 Ответ

1 голос
/ 03 февраля 2012

Да, вы можете загружать пользовательские элементы управления динамически, используя метод LoadControl . Если у вас есть Control1 и Control2, где Control2 наследует от Control1, вы можете сделать это на странице:

//Obtain control name in the format "~/pathFromApplicationRoot/ControlName.ascx"
string controlName = MethodThatDecidesTheControlNameToLoad();
//Load control
var userControl = (Control1)this.LoadControl(controlName);
//Add it to page
AControlSuchAsAPlaceHolder.Controls.Add(userControl);

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...