ASP: расширение управления (ASCX) и доступ к базовому файлу разметки из кода подкласса
Я создаю средства проверки формы для нашего приложения на C# ASP. Большая часть работы обрабатывается элементом управления BaseValidator (подкласс System.Web.UI.UserControl), который также имеет разметку для вывода проверки. Затем это расширяется подконтролями, такими как PasswordValidator, который предоставляет метод Validate и любые дополнительные поля, необходимые для этого элемента управления validator.
(Конечная цель состоит в том, чтобы иметь элементы управления, такие как
Однако PasswordValidator.ascx.cs не может получить доступ к элементам формы, определенным в BaseValidator.ascx; единственный способ, который я нашел, - это дублировать разметку в файле *.ascx каждого субконтроля. Как я могу расширить BaseValidator.ascx.cs и получить доступ к разметке BaseValidator.ascx в подклассе?
3 ответа
Спасибо за предложения.
Я решил это, используя сервис и шаблон стратегии. Существует центральный класс FieldValidator, который обеспечивает проверку для любого пользовательского интерфейса. Для веб-интерфейса эти методы предоставляются через WebService и (через WebService) UserControl. Нет проблем с доступом к элементам страницы, потому что теперь существует только один класс UserControl, который стоит между формой и WebService.
Например, <uc1:FieldValidator ControlType="Password" ControlToValidate="txtPassword" runat="server" >
будет выполнять полнофункциональную проверку на стороне клиента и на стороне сервера, без необходимости кода. Большой!:)
(Я упомянул резолюцию некоторое время назад в ответе на мой вопрос, но я не могу пометить это как ответ.)
Если у вас есть истинный базовый класс для вашего элемента управления BaseValidator, который расширяет ваш PasswordValidator, то любая разметка / элементы управления в базовом классе должны быть доступны через защищенные свойства. Я бы даже зашел так далеко, что утверждал, что у истинной базы не должно быть части ascx. Базовый класс должен предоставлять методы и свойства, которые предоставляют элементы управления встроенным на лету (вероятно, во время Page_Init для поддержки viewstate).
Если у вас есть 2 отдельных элемента управления на одной и той же странице, ваша родительская страница может быть изменена для предоставления брокерских методов, позволяющих такое общение.
Если у вас есть PasswordValidator и вам просто нужны элементы управления / разметка, вы можете использовать метод LoadControl, чтобы создать экземпляр BaseControl в памяти, получить программный доступ к его элементам управления / разметке и либо добавить, либо уничтожить его в зависимости от того, что вы хотите сделать с этим.
За исключением всего этого, это будет так же, как сказал @Shawn. Управление сервером.
Я почти уверен, что для этого вам нужно будет создать элементы управления сервером. Это означает, что вам нужно будет генерировать выводимую разметку из кода в элементе управления, а не в файле.ascx.