Używając Panel lub PlaceHolder

152

Jaka jest różnica między <asp:Panel >i <asp:PlaceHolder >w ASP.NET?

Kiedy należy używać jednego nad drugim?

p.campbell
źródło

Odpowiedzi:

161

Panel rozwija się do zakresu (lub elementu div) z zawartością w nim. Symbol zastępczy to po prostu symbol zastępczy, który jest zastępowany przez wszystko, co w nim wstawisz.

Steven Robbins
źródło
19
Panel staje się DIV
mbillard
4
Może również stać się Spanem, w zależności od wersji ASP.Net i przeglądarki, którą renderuje.
Steven Robbins
9
Ech, nie zaczynaj mnie z BrowserCaps - może również stać się pojedynczą tabelą komórkową w .Net 1.1 w przeglądarkach „Downlevel”.
Zhaph - Ben Duguid
6
Heh, próbowałem wymusić renderowanie tabel na niższym poziomie .. dzięki za przywrócenie tego :-)
Steven Robbins
1
@Protectorone: Powyższe komentarze dotyczą paneli, a nie symboli zastępczych.
Brian
63

Element zastępczy nie renderuje żadnych tagów dla siebie, więc świetnie nadaje się do grupowania treści bez narzutu zewnętrznych znaczników HTML.

Panel ma zewnętrzne tagi HTML, ale ma kilka fajnych dodatkowych właściwości.

  • BackImageUrl: Pobiera / ustawia adres URL obrazu tła dla panelu

  • HorizontalAlign: Pobiera / ustawia
    wyrównanie w poziomie zawartości elementu nadrzędnego

  • Zawijaj: Pobiera / ustawia, czy zawartość
    panelu jest zawijana

Jest dobry artykuł na startvbnet tutaj .

Ray Booysen
źródło
15
Kolejną fajną funkcją asp: Panel jest to, że ma właściwość DefaultButton, która informuje go, który przycisk ma kliknąć, jeśli użytkownik naciśnie klawisz Enter na klawiaturze. Przydatne, jeśli masz wiele paneli i przycisków na tej samej stronie, które muszą działać z przyciskiem Enter.
Alex York
1
@Marko po zmaganiach z dziedziczeniem niestandardowej kontroli użytkownika, zgadzam się
drzaus
W 2009 roku, kiedy WebForms były de facto sposobem .NET na tworzenie programów ASP.NET, wtedy tak. W grudniu 2012 roku, prawie 4 lata później prawdopodobnie nie. Dziwny komentarz
Ray Booysen
1
Link startvbnet jest martwy.
mmcglynn
1
To samo, co moje uwagi powyżej - dziękuję za dostarczenie bardzo cennych szczegółów. Pomogło to wyjaśnić, dlaczego były one używane w kodzie zamiast innych rozwiązań dla modułu DNN, który próbuję zaktualizować.
user1585204
36

Kontrolka PlaceHolder

Użyj kontrolki PlaceHolder jako kontenera do przechowywania formantów serwera, które są dynamicznie dodawane do strony sieci Web. Formant PlaceHolder nie generuje żadnych widocznych danych wyjściowych i jest używany tylko jako kontener dla innych formantów na stronie sieci Web. Możesz użyć Control.Controlskolekcji, aby dodać, wstawić lub usunąć kontrolkę w kontrolce PlaceHolder.

Panel sterowania

Kontrolka panelu jest kontenerem dla innych kontrolek . Jest to szczególnie przydatne, gdy chcesz programowo generować formanty, ukryć / pokazać grupę kontrolek lub zlokalizować grupę kontrolek.

DirectionWłaściwość jest przydatna do lokalizowania zawartości kontrolki na panelu do wyświetlania tekstu w językach, które są pisane od prawej do lewej, takich jak arabski lub hebrajski.

Formant Panel zapewnia kilka właściwości, które umożliwiają dostosowanie zachowania i wyświetlania jego zawartości. Użyj BackImageUrwłaściwości l, aby wyświetlić niestandardowy obraz dla kontrolki Panel. Użyj ScrollBarswłaściwości, aby określić paski przewijania dla kontrolki.

Małe różnice podczas renderowania HTML: kontrolka PlaceHolder nie będzie renderować niczego, ale kontrolka Panel będzie renderować jako plik <div>.

Więcej informacji na forach ASP.NET

ecleel
źródło
1
To doskonałe szczegółowe wyjaśnienie. Musiałem tylko zobaczyć, dlaczego te tagi zostały użyte. programista modułu (teraz tajemniczo zniknął :)) po prostu ma te dynamicznie utworzone w kodzie za nim. Nigdy wcześniej ich nie używałem, będąc facetem od interfejsu JavaScript od około 7 lat. Dzięki za wspaniały wkład.
user1585204
5

Mam dziwny błąd * w Visual Studio 2010, jeśli umieścisz kontrolki wewnątrz obiektu zastępczego, nie wyrenderuje ich w trybie widoku projektu.

Dotyczy to zwłaszcza etykiet Hidenfields i Empty.

Chciałbym używać symboli zastępczych zamiast paneli, ale nienawidzę faktu, że nie mogę umieszczać innych elementów sterujących w elementach zastępczych w czasie projektowania w interfejsie GUI.

George Filippakos
źródło
5
Ludzie nadal używają trybu widoku projektu? ;)
Matthew Lock
2
haha - zrezygnowałem z używania go lata temu, ale MS nadal nie naprawił błędu
George Filippakos
Wciąż czekam, aż to zostanie naprawione!
Nikki Punjabi
1

Jak wspomniano w innych odpowiedziach, Panel generuje <div>w HTML, podczas gdy PlaceHolder nie. Ale jest o wiele więcej powodów, dla których możesz wybrać jeden z nich.

Dlaczego PlaceHolder?

Ponieważ nie generuje własnego tagu, możesz go bezpiecznie używać wewnątrz innego elementu, który nie może zawierać znaku <div>, na przykład:

<table>
    <tr>
        <td>Row 1</td>
    </tr>
    <asp:PlaceHolder ID="PlaceHolder1" runat="server"></asp:PlaceHolder>
</table>

Możesz również użyć elementu PlaceHolder, aby kontrolować widoczność grupy formantów bez zawijania go w plik <div>

<asp:PlaceHolder ID="PlaceHolder1" runat="server" Visible="false">
    <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
    <br />
    <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
</asp:PlaceHolder>

Dlaczego panel

Generuje własne <div>i może być również używany do pakowania grupy Contoli. Ale panel ma znacznie więcej właściwości, które mogą być przydatne do formatowania jego zawartości:

<asp:Panel ID="Panel1" runat="server" Font-Bold="true"
    BackColor="Green" ForeColor="Red" Width="200"
    Height="200" BorderColor="Black" BorderStyle="Dotted">
    Red text on a green background with a black dotted border.
</asp:Panel>

Ale najbardziej użyteczną funkcją jest DefaultButtonwłaściwość. Gdy identyfikator pasuje do przycisku w panelu, po enternaciśnięciu przycisku wewnątrz pola tekstowego zostanie wywołany formularz z potwierdzeniem. Teraz użytkownik może przesłać formularz bez naciskania przycisku.

<asp:Panel ID="Panel1" runat="server" DefaultButton="Button1">
    <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
    <br />
    <asp:RequiredFieldValidator ID="RequiredFieldValidator1" runat="server"
        ErrorMessage="Input is required" ValidationGroup="myValGroup"
        Display="Dynamic" ControlToValidate="TextBox1"></asp:RequiredFieldValidator>
    <br />
    <asp:Button ID="Button1" runat="server" Text="Button" ValidationGroup="myValGroup" />
</asp:Panel>

Wypróbuj powyższy fragment, naciskając enterwewnątrzTextBox1

VDWWD
źródło