Статьи

Получение строго типизированных ссылок управления из LoginViews без использования FindControl ()

Сегодня я работал над довольно сложной веб-формой, в которой используется несколько элементов управления LoginView с шаблонами для конкретных ролей, содержащими пользовательские элементы управления UserControl. Сначала я подумал, что могу просто ссылаться на элементы в шаблонах ContentView в LoginView. Но это не совсем так. ControlTemplates ведут себя как слабо типизированные ITemplates. Теперь можно использовать надежный старый метод FindControl (string) для определения имени элемента управления. Но это всегда заставляет меня чувствовать себя немного странно, так как это не проверяется во время компиляции. Не обращайте внимания на вероятность ошибок, если, например, кто-то изменил идентификатор элемента управления. Или обернуть его в родительский элемент управления, скрывая его от иерархии элементов управления. Ссылка на объект Hello не установлена ​​на экземпляр объекта.

Вместо этого я понял, что можно очень легко и чисто сделать следующее:

  1. В кодовом файле (или любом другом, содержащем LoginView) создайте защищенную переменную типа требуемого UserControl или пользовательского ServerControl или чего-либо еще.
  2. В элементе управления, на который вам требуется ссылка, подключите событие OnInit.
  3. В обработчике события OnInit сопоставьте отправителя с переменной, созданной на шаге 1.

Или, если это не имеет смысла, просто посмотрите примеры кода ниже:

Сначала код ASPX:


<asp:LoginView ID="PermissionsLoginView" runat="Server">
	<RoleGroups>
		<asp:RoleGroup Roles="Administrator">
			<ContentTemplate>
				<wwb:UserPermissions 
					ID="UserPermissionsCtl" 
					runat="server" 
					OnInit="UserPermissionsCtl_Init" 
				/>
			</ContentTemplate>
		</asp:RoleGroup>
	</RoleGroups>
</asp:LoginView>

Ключевым элементом здесь является вызов wwb: UserPermissions для OnInit.

А теперь немного о кодовом файле:

 
//Variable to contain the user control reference.
protected UserPermissions UserPermissions = null;

//handler for the UserPermissionsCtl's Init event.
protected void UserPermissionsCtl_Init(object sender, EventArgs e)
{
	UserPermissions = (UserPermissions)sender;
}

Я не пробовал ничего, кроме LoginView, но он должен работать для других мульти-шаблонных элементов управления (таких как MultiView). Наслаждайтесь и счастливого кодирования.