2015-06-19 8 views
5

Próba przeniesienia wspólnego kontrolki niestandardowej do nowej biblioteki klas (także wypróbowania nowego projektu WWW), aby inne projekty mogły z niego korzystać, ale jej właściwości są zawsze NULL, gdy jest używany w innym projekcie. Szukanie podobnych pytań niestety nie pomoże rozwiązać mojego problemu.Kontrola użytkownika Asp.NET, do której odwołuje się inny projekt/dll ma właściwości NULL

zarejestrować nową kontrolę w naszej web.base.config Project-A

<add tagPrefix="Controls" namespace="Comp.UserWebControls.Controls" assembly="Comp.UserWebControls" /> 

dodaje jako odniesienie projektu w Project-A Comp.UserWebControls (próbowałem również dodanie dll kompilacji jako odniesienie w Project-A, nie ma różnicy)

znaczniki wygląda

<asp:Content ID="Content4" ContentPlaceHolderID="RightPlaceHolder" runat="server"> 
<Controls:uxMyControl ID="TestingThing" runat="server" /> 

W kodzie źródłowym tworzona jest kontrola "TestingThing", ale wszystkie właściwości mają wartość NULL (Etykiety, pola tekstowe itp.).

Zwykle, jeśli kontrola była w obrębie tego samego projektu (projekt-A), wówczas powinienem zarejestrować kontrola taka jak ta:

<add tagPrefix="Contols" tagName="uxMyControl" src="~/Controls/uxMyControl.ascx"/> 

W kodzie obiekt kontrolny wygląda dobrze, właściwości są tworzone i działają zgodnie z oczekiwaniami.

Nie mogę wykonać src="myPath" podczas korzystania z zespołu, więc myślę, że ma to coś wspólnego z tym.

W jaki sposób mogę oddzielić tę kontrolę od nowego zestawu/projektu/rozwiązania, aby inne projekty mogły z niego korzystać.

Każda pomoc zostanie doceniona dzięki!

+0

Czy umieściłeś plik '.ascx' w innym projekcie, w którym chcesz użyć niestandardowego formantu? –

+0

Te wątki SO mogą Ci pomóc - http://stackoverflow.com/questions/709617/using-user-controls-from-other-projects-in-asp http://stackoverflow.com/questions/10340610/asp -net-user-control-instance-is-null-when-referenced-on-page-load-on-page-code –

+0

@ChandanRoy - Yup i przeniosłem kontrolę użytkownika w całości do nowego projektu. Sprawdzam ten link dzięki – Jerrold

Odpowiedz

2

Nie sądzę, że można pobrać plik User Control (np. Plik .ascx) i umieścić go w bibliotece klas, aby można go było współdzielić między różne aplikacje.

Zamiast tego należy napisać Custom Control. Jest to w zasadzie klasa (pojedynczy plik .cs, bez skojarzonego ascx), który pochodzi od Control (lub wariantu Control - na przykład można uzyskać z DropDownList, jeśli chcesz utworzyć własną niestandardową listę kontrolną listy rozwijanej).

Różnice: https://msdn.microsoft.com/en-us/library/aa651710(v=vs.71).aspx

istnieje inny artykuł MSDN tutaj: https://msdn.microsoft.com/en-us/library/aa479318.aspx który omawia w jaki sposób utworzyć formant niestandardowy z kontroli użytkownika, jeśli nie czują się bardzo komfortowo z myślą o nim.

To określa czynności jak następuje:

  1. Napisz swoją kontrolę użytkownika, jak normalnie, zazwyczaj przy użyciu programu Visual Studio projektanta.
  2. Przetestuj za pomocą prostej strony przed próbą wdrożenia.
  3. Wdróż aplikację, aby ją skompilować.
  4. Chwyć użytkownika za złożony zespół kontrolny użytkownika wyprodukowany przez etap wdrażania, a Ty jesteś zasadniczo ukończony: Masz swoją niestandardową kontrolę.
  5. Na koniec użyj niestandardowego kontrolki w innych aplikacjach w taki sam sposób, jak zawsze używaj niestandardowych elementów sterujących .

Jeśli chcesz mieć kolekcję kontroli i nie chce oddzielny DLL dla każdego, a następnie można użyć decompiler takie jak reflektor, aby spojrzeć na to, co zostało wygenerowane i po prostu skopiować/wkleić go do Twoja biblioteka klas współużytkowanych elementów sterujących.

Powinieneś być w stanie zarejestrować tagPrefix i nazw jak już pokazał: <add tagPrefix="Controls" namespace="Comp.UserWebControls.Controls" assembly="Comp.UserWebControls" />

i powinno być gotowe.

Jeśli kontrola użytkownika nie była szczególnie skomplikowana, prawdopodobnie miałabym ochotę przeczytać o czystym kodzie Custom Controls i spróbować po prostu napisać to tak, zamiast próbować przechwytywać i dekompilować bibliotekę DLL.

Myślę, że powód, dla którego uzyskujesz zerowe wartości, jest najprawdopodobniej związany z okresem wyświetlania i cyklem życia strony. To jest zawsze coś, z czym zmagałem się najbardziej w Webformach, szczególnie dynamicznie ładowanych kontrolkach, zastanawiając się, gdzie w cyklu życia należy je załadować. Przypominam sobie, że jeśli dodawałeś je dynamicznie na przykład na Page_Load, zawsze działałyby, ale nigdy nie utrzymywałyby wartości w postbackach, ale wtedy zadziałało Page_Init.

Powiedziałbym - utwórz niestandardową kontrolę, plik z jedną klasą dla kontroli użytkownika, pozbyć się wszelkich śladów po .ascx i powinieneś być gotowy.

+0

Wielkie dzięki - odłożyłem ten pomysł, ponieważ nie chciałem zbyt długo obracać kółek i wróciłem, aby skopiować/wkleić stronę do 2 projektów. Mam nadzieję, że nie będziemy mieli czasu na powtórkę i refaktoryzację w przyszłości. Dziękuję za zwięzłą odpowiedź. Mam nadzieję, że inni z tym samym problemem mogą zweryfikować. Oznaczę to jako najbardziej poprawne. – Jerrold

Powiązane problemy