Pytanie Program ASP.NET UserControl nie inicjuje kontroli nad dziećmi


Na mojej stronie mam następujące:

<aspe:UpdatePanel runat="server" ID="updatePanel">
    <ContentTemplate>
        <local:KeywordSelector runat="server" ID="ksKeywords" />
    </ContentTemplate>
</aspe:UpdatePanel>

The KeywordSelector kontrola to kontrola, którą definiuję w tym samym zespole i local jest zmapowany do swojej przestrzeni nazw.

Kontrola składa się z kilku innych kontroli i jest zdefiniowana jako taka:

<%@ Control Language="C#" AutoEventWireup="true"
            CodeBehind="KeywordSelector.ascx.cs"
            Inherits="Keywords.KeywordSelector" %>

i ma kilka własnych kontrolek serwera, wszystkie zdefiniowane jako członkowie w .designer.cs plik.

Jednak, podczas żadnej części cyklu kontrolnego nie ma żadnych obiektów kontroli podrzędnej ani nie tworzy HTML:

  1. Wszyscy członkowie zdefiniowani w .designer.cs plik jest null.
  2. Połączenia z HasControls powrót false.
  3. Połączenia z EnsureChildControls nic nie robić.
  4. The Controls kolekcja jest pusta.

Usuwanie UpdatePanel nie zrobił nic dobrego. Próbowałem odtworzyć go na czystej stronie z nowym UserControl i to samo się dzieje.

Korzystam z ASP.NET przez .NET Framework 3.5 SP1 z zintegrowanym serwerem WWW.

Czego tu mi brakuje?

Aktualizacja nr 1: Po komentarzu Roba przyjrzałem się OnInit i okazało się, że UserControl nie wykrywa, że ​​ma jakiekolwiek kontrole podrzędne. Co więcej, CreateControlCollection nigdy nie jest wywoływany!


14
2017-10-28 13:14


pochodzenie


Czy zastąpiłeś OnInit i usuniesz linię bazową.OnInit (e); w wypadku? - Rob
Nie. Właśnie sprawdziłem i zostanie wywołany przed moją metodą Page_Load, więc to jest OK, tak myślę. - Omer van Kloeten
Bummer - miał nadzieję, że to będzie łatwe :) - Rob
Czy dynamicznie ładujesz ten formant? - thismat
Nie. Przeczytaj o nich też ... - Omer van Kloeten


Odpowiedzi:


Cóż, znalazłem problem (y):

  1. Elementy sterowania użytkownika, w przeciwieństwie do Niestandardowe kontrole muszą być rejestrowane jeden po drugim w pliku web.config plik. Zrób to:

    <add tagPrefix="local" tagName="KeywordSelector" src="~/KeywordSelector.ascx" />

    zamiast:

    <add tagPrefix="local" namespace="Keywords" assembly="Keywords" />

  2. Nigdy nie powinieneś umieszczać WebControl w tym samym katalogu co Control to go używa. To jest po prostu głupie. Przeczytaj o tym tutaj.

Dzięki za pomoc. Teraz, gdybym tylko mógł zaznaczyć własną odpowiedź jako  odpowiedź...


24
2017-10-28 14:17



Och, dziękuję za rozwiązanie :) - Janis Veinbergs
Cieszę się, że pomógł komuś innemu :) - Omer van Kloeten
Po prostu spędziłem godziny próbując rozwiązać ten problem! Bardzo niejasny problem (i zbyt wiele fałszywych pozytywnych trafień przy próbie Binga odpowiedzi na to). Dzięki! - Alan McBee - MSFT
Dzięki, dzięki temu mogłem odkryć coś dziwnego dla siebie. Możesz także <@Zarejestruj go na stronie. W moim scenariuszu mam niektóre z własnych kontrolek Validator i muszę je zarejestrować poprzez zespół, aby z nich korzystać. Ja korzystałem z Kontroli użytkownika skompilowanej i uruchomionej, ponieważ przestrzeń nazw była dostępna, ale znaczniki (i oczekiwane automatyczne tworzenie kontroli podrzędnych) nie były przetwarzane. Moim rozwiązaniem było zarejestrowanie zarówno przestrzeni nazw, jak i kontroli użytkownika. Więc w zasadzie skończyłem z twoimi liniami powyżej (z wyjątkiem tego, że użyłem @Register na samej stronie hosta). Twoje zdrowie! - andrew
Oprócz zmiany web.config Musiałem dodać <% Register %> do strony w postaci: <%@ Register TagPrefix="custom" Namespace="CustomControls" Assembly="CurrentAssembly" %> - Dusan Vasiljevic


W moim przypadku powodem było to, że Resharper 7.1 dodał nieprawidłową dyrektywę @Register u góry aspx - zamiast tego pożądanego wiersza:

<%@ Register Src="~/Controls/Hello/Hello.ascx" TagName="Hello" TagPrefix="p" %>

pomyliłem się jeden:

<%@ Register TagPrefix="p" Namespace="MyNamespace.WebApp.Controls" Assembly="MyApp.Web" %>

0
2017-10-24 16:04