2009-09-18 13 views

Odpowiedz

7

Niels,

Dźwignia odbicie (jak sugeruje JDunkerley) to jedno podejście do problemu. Innym rozwiązaniem, które możesz rozważyć, jest implementacja interfejsu:

  1. Utwórz interfejs zawierający wybraną metodę.
  2. Zaimplementuj interfejs na swojej stronie wzorcowej.
  3. Od kontroli, odwołaj się do this.Page.Master poprzez typ interfejsu.
  4. Zadzwoń do swojej metody.

To jest lepsze podejście do OO, prowadzi do mniejszego sprzężenia i na pewno będzie działać lepiej niż odbicie czasu pracy.

Mam nadzieję, że to pomoże!

+0

Użyłem tego podejścia i wszystko działało dobrze! Dzięki –

+0

Cieszę się, że mogę pomóc! Wesołe kodowanie :-) –

12

Trzeba rzucić this.Page.Master najpierw jako własność Page Master jest typu System.Web.UI.MasterPage.

np

((MyMaster)this.Page.Master).MyFunction(); 

można sprawdzić typ bazowego strony wzorcowej dodając obiekt do kod związany z kontrolą użytkownika:

public string MType 
    { 
     get { return this.Page.Master.GetType().FullName; } 
    } 

i wydrukuj wynik w znaczniku użytkownika, np. dodać tę linię, aby wydrukować jako komentarz w kodzie źródłowym:

<!-- <%= MType %> //--> 
+0

Występuje błąd informujący, że nie można znaleźć typu lub przestrzeni nazw _Master? –

+0

możesz spróbować sprawdzić typ strony wzorcowej w RunTime. Zaktualizuje odpowiedź w drugim numerze: – JDunkerley

+0

Typ ASP.masterpage_master, ale nie jest dostępny w czasie kompilacji. –

4

Jesteś couppling kod bardzo thighly jeśli wywołania funkcji na masterpage z poziomu kontroli użytkownika.

Kontrolki można używać tylko na stronach opartych na tym wzorcu. Myślę, że to zwykle zły projekt, który naruszy przynajmniej prawo demeter.

Co dokładnie chcesz osiągnąć pod kontrolą?

1

JDunkerley ma to prawo. Ale pozwól mi wyjaśnić, jak rozdzielić go za pomocą MVP, abyś mógł pracować nad unikaniem kwestii projektowej, o której mówi Heiko Hatzfeld.

Zasadniczo zaimplementuj wzorzec MVP dla kontrolki i strony wzorcowej. Aby uzyskać instrukcje, jak to zrobić, patrz here. Deklaracja metody, którą chcesz wywołać w interfejsie master (IMasterView). Następnie utwórz klasę, która będzie kontrolować relację między dwoma komponentami; nazwiemy to klasą PageController. Umieść instancję tej klasy w stanie żądania dla każdego żądania, dodając następujący wiersz do pliku global.asax.CS:

/* global.asax.cs */ 
protected void Application_BeginRequest(object sender, EventArgs e) 
{ 
    // ... 
    HttpContext.Current.Items["Controller"] = new PageController(); 
    // ... 
} 

Następnie można uzyskać dostęp do tej instancji z każdego z prezenterów (master i kontrolnych) poprzez następujący wiersz kodu:

var controller = HttpContext.Current.Items["Controller"] as PageController; 

Następnie można wdrożyć zdarzenie lub inny mechanizm do zezwól kontrolce na wywołanie metody na systemie głównym w sposób niezwiązany z tym wspólnym obiektem. Na przykład:

/* PageController.cs */ 
public event EventHandler SomeEvent; 

protected virtual void OnSomeEvent(EventArgs e) 
{ 
    Debug.Assert(null != e); 

    var handler = this.SomeEvent; 
    if (null != handler) 
     handler(this, e); 
} 

public void FireSomeEvent() 
{ 
    this.OnSomeEvent(EventArgs.Empty); 
} 

/* ControlPresenter.cs */ 
public ControlPresenter(IControlView view) 
    : base() 
{ 
    view.EventFired += (sender, e) => 
    { 
     var controller = HttpContext.Current.Items["Controller"] as PageController; 
     controller.FireSomeEvent(); 
    }; 
} 

/* MasterPresenter.cs */ 
public MasterPresenter (IMasterView view) 
    : base() 
{ 
    var controller = HttpContext.Current.Items["Controller"] as PageController; 
    controller.SomeEvent += (sender, e) => view.MyFunction(); 
} 

Upewnij się, że „EventFired” zdarzenie jest zadeklarowane w interfejsie kontrolą użytkownika (IControlView) i wdrażane w sterowaniu. Wtedy wszystko, co musisz zrobić, aby wpłynąć na mistrza (zadzwoń do jego metody), to odpal to wydarzenie, a MVP + PageContoller zajmie się resztą.

Cheers

1

nie mogę uzyskać odpowiedzi na powyższe pracy, więc tutaj jest to, co pracował dla mnie:

Chcesz odwołać właściwość strony wzorcowej z formantu użytkownika.

Po pierwsze, strona mistrz będzie miał własność publiczną tak:

public string BodyClass 
{ 
    set 
    { 
     this.masterBody.Attributes.Add("class", value); 
    } 
} 

teraz dodać odwołanie do strony wzorcowej w pliku ASCX sterowania użytkownik tak:

<%@ Register Src="~/Source/MasterPages/Main.master" TagPrefix="MSTR" TagName="MasterPage" %> 

Następnie w kod za (C# w moim przypadku) masz ten kod:

Main masterPage = (Main)this.Page.Master; 
masterPage.BodyClass = "container"; 

Bez odniesienia na stronę wzorcową powyżej twoja kontrola użytkownika nie będzie w stanie znaleźć klasy strony wzorcowej.

Powiązane problemy