2009-08-17 14 views
8

Próbuję dynamicznie ładować formant użytkownika na stronie asp.web. Jednak ze względu na to, jak projekty stron internetowych asp.net są skonfigurowane (jak sądzę), nie jestem w stanie uzyskać dostępu do definicji typu kontrolki użytkownika.Dynamicznie ładuj formant użytkownika (ascx) na stronie asp.net

dostaję komunikat, że moja klasa HE_ContentTop_WebControl1 jest: (? Czy brakuje using dyrektywa lub odwołania do zestawu) on wpisać lub nazwa przestrzeni nazw „HE_ContentTop_WebControl1” Nie można znaleźć

Każdy pomysł, jak to może być gotowy do pracy? Próbowałem używać przestrzeni nazw, ale wydaje mi się, że witryny asp.net nie są domyślnie zaprojektowane do pracy z przestrzeniami nazw. Byłbym zainteresowany podejściem innym niż przestrzeń nazw.

TIA

public partial class HE_Default : 
    System.Web.UI.Page { 

    protected void Page_Load(object sender, EventArgs e) 
    { 
     var control = (HE_ContentTop_WebControl1)Page.LoadControl("~/ContentTop/WebControl1.ascx");   
    } 
} 
+1

Nie zapominaj, że musisz także umieścić ten załadowany formant gdzieś na stronie, np. symbol zastępczy. –

Odpowiedz

10

Zakładając kontrolę istnieje w tym samym zespole jako projektu WWW, trzeba dodać dyrektywę odniesienia w pliku .aspx,

np

<%@ Reference Control="~/Controls/WebControl1.ascx"> 

Należy pamiętać, że często zajmuje to kilka minut (lub czasami kompilację) dla IntelliSense, aby to odebrać.

+0

Dziękuję bardzo. Przyjąłem, że odniesienie nie jest potrzebne, jeśli wskazałem lokalizację pliku kodu. Wydaje się nieco zbędne, aby dodać plik, ale ponownie założyłem ... –

+0

Jeśli masz do czynienia z wieloma kontrolkami użytkownika, naprawdę nie poleciłbym tego podejścia. Z mojego doświadczenia wynika, że ​​rozwiązanie polegające na dodawaniu kontrolek użytkownika do przestrzeni nazw, a następnie ładowaniu ich dynamicznie, jest o wiele bardziej wszechstronne. – Tchami

+0

Tak, jest to trochę zbędne, ale w zasadzie dyrektywa referencyjna dotyczy ASP.NET, więc może faktycznie rozwiązać rzutowanie na Page.LoadControl w odpowiednim czasie. Cieszę się, że mogłem pomóc! – jscharf

7

Można to łatwo zrobić przy użyciu przestrzeni nazw. Oto przykład:

WebControl1.ascx:

<%@ Control Language="C#" AutoEventWireup="true" CodeFile="WebControl1.ascx.cs" Inherits="MyUserControls.WebControl1" %> 

Uwaga, Dziedziczy odnośniki przestrzeni nazw (MyUserControls), a nie tylko nazwa klasy (WebControl1)

WebControl1.ascx.cs:

namespace MyUserControls 
{ 
    public partial class WebControl1 : System.Web.UI.UserControl 
    { 
     protected void Page_Load(object sender, EventArgs e) 
     { 

     } 
    } 
} 

Zauważ, że klasa zostały zawarte w MyUserControls przestrzeni nazw

Default.aspx.cs:

using MyUserControls; 

public partial class _Default : System.Web.UI.Page 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     var control = (WebControl1) Page.LoadControl("~/WebControl1.ascx"); 
    } 
} 

Podejście potencjalnie pozwala na redystrybucję formanty użytkownika (lub zachować je w odrębnym projekcie), bez konieczności odwoływania się je w .aspx plików.

+0

Gdzie umieścić ten plik ascx? Jeśli umieściłbym go tam, gdzie nie mogę zaimportować przestrzeni nazw, chyba że wstawię katalog app_code. Jeśli wstawię katalog app_code, to daje mi błąd, którego nie możesz tam umieścić. –

+0

Co masz na myśli, że nie możesz zaimportować przestrzeni nazw? – Tchami

+0

przestrzeń nazw MyUserControls .. Gdzie umieścić plik ascx (w appcode lub bin). Umieściłem go w folderze kontrolek, ale nie rozpoznaje on przestrzeni nazw MyUserControls. –

1

odniesienie nie jest wystarczająco użyciu

<%@ Reference Control="~/Controls/WebControl1.ascx"> 

w pliku aspx to tylko jedna część odpowiedzi.

trzeba również dodać calssName w pliku aspx sterowania użytkownika

<%@ Control ClassName="WebControl1" Language="C#" AutoEventWireup="true" CodeFile="WebControl1.ascx.cs" Inherits="AnySpaceName.DateSelector" %> 

a następnie można użyć userontrol w pliku aspx

AnySpaceName.WebControl1 WC = (AnySpaceName.WebControl1)Page.LoadControl("~/WebControl1.ascx");  
1

Casting kontrolę użytkownika w ten sposób mogą tworzyć wiele problemów. Moje podejście polega na stworzeniu klasy (np. klasy kontrolnej), w której wszystkie właściwości i metody są potrzebne do jej rzucania i dziedziczą tę klasę z System.Web.UI.UserControl. Następnie w pliku kodu cotrol użytkownika zamiast Systemu .Web.UI.UserControl użytkownik tej klasy kontrolnej.

teraz, gdy kiedykolwiek potrzebujesz rzucania, rzucaj tylko tą klasą. będzie również lekki odlew.

2

Temat tego posta jest nieco mylący. Jeśli chcesz po prostu dodać formant dynamicznie, nie trzeba odwoływać się do kontroli, a zatem można po prostu dodać coś prostego jak:

protected void Page_Load(object sender, EventArgs e) 
{ 
    Page.Controls.Add(Page.LoadControl("~/MyControl.ascx")); 
} 

bez głowach przestrzeni nazw.

4

Przestrzenie nazw nie są obsługiwane w modelu strony. W związku z tym nie mogłem uzyskać żadnego z zaproponowanych rozwiązań. Istnieje jednak rozwiązanie. Utwórz interfejs i umieść go w kodzie aplikacji, a następnie zaimplementuj interfejs w formancie użytkownika. Możesz przesyłać do interfejsu i działa.

+0

Dzięki, pomogło mi to wdrożyć rozwiązanie Tchami w "witrynie", nad którą pracuję. Jak już powiedziałeś, nie mogłem odnieść się do klasy jako pierwszej, ale dzięki twoim wyjaśnieniom i sugestii interfejsu, teraz działało idealnie! – Magnus

Powiązane problemy