Usando Panel ou PlaceHolder

152

Qual é a diferença entre <asp:Panel >e <asp:PlaceHolder >no ASP.NET?

Quando você deve usar um sobre o outro?

p.campbell
fonte

Respostas:

161

Um painel se expande para um intervalo (ou uma div), com seu conteúdo. Um espaço reservado é apenas isso, um espaço reservado que é substituído pelo que você colocar nele.

Steven Robbins
fonte
19
Um painel se torna um DIV
mbillard
4
Também pode se tornar um Span, dependendo da versão do ASP.Net e do navegador que está sendo renderizado também.
Steven Robbins
9
Por favor, não me inicie com o BrowserCaps - ele também pode se tornar uma tabela de célula única no .Net 1.1 nos navegadores "Nível inferior".
Zhaph - Ben Duguid 27/01/09
6
Heh, eu tentei forçar nível inferior da tabela de renderização fora da minha mente .. Obrigado por trazer isso de volta :-)
Steven Robbins
1
@ Protectorone: Os comentários acima são sobre painéis, não espaços reservados.
Brian
63

O espaço reservado não renderiza nenhuma tag para si mesmo, portanto, é ótimo para agrupar conteúdo sem a sobrecarga de tags HTML externas.

O Painel possui tags HTML externas, mas possui algumas propriedades extras interessantes.

  • BackImageUrl: obtém / define o URL da imagem de plano de fundo do painel

  • HorizontalAlign: Obtém / Define o
    alinhamento horizontal do conteúdo do pai

  • Quebrar: Obtém / Define se o
    conteúdo do painel é agrupado

Há um bom artigo no startvbnet aqui .

Ray Booysen
fonte
15
Outro recurso interessante para um asp: Panel é que ele possui uma propriedade DefaultButton, informando em qual botão clicar se o usuário pressionar Enter no teclado. Prático, se você tiver vários painéis e botões na mesma página que precisam trabalhar com o botão Enter.
Alex York
1
@Marko depois de lutar com a herança controle de usuário personalizada, eu concordo
drzaus
Em 2009, quando WebForms era a maneira .NET de fato de executar o ASP.NET dev, então sim. Em dezembro de 2012, quase 4 anos depois, provavelmente não. Comentário estranho
Ray Booysen
1
O link startvbnet está inoperante.
mmcglynn
1
O mesmo que meus comentários acima - obrigado por fornecer detalhes muito valiosos. Isso ajudou a esclarecer por que eles estavam sendo usados ​​no código atrás, em vez de outras soluções para um módulo DNN que estou tentando atualizar.
User1585204
36

Controle PlaceHolder

Use o controle PlaceHolder como um contêiner para armazenar controles de servidor que são adicionados dinamicamente à página da Web. O controle PlaceHolder não produz nenhuma saída visível e é usado apenas como um contêiner para outros controles na página da Web. Você pode usar a Control.Controlscoleção para adicionar, inserir ou remover um controle no controle PlaceHolder.

Painel de controle

O controle Panel é um contêiner para outros controles . É especialmente útil quando você deseja gerar controles programaticamente, ocultar / mostrar um grupo de controles ou localizar um grupo de controles.

A Directionpropriedade é útil para localizar o conteúdo de um controle Panel para exibir texto para idiomas escritos da direita para a esquerda, como árabe ou hebraico.

O controle Panel fornece várias propriedades que permitem personalizar o comportamento e a exibição de seu conteúdo. Use a BackImageUrpropriedade l para exibir uma imagem personalizada para o controle Panel. Use a ScrollBarspropriedade para especificar barras de rolagem para o controle.

Pequenas diferenças ao renderizar HTML: um controle PlaceHolder renderizará nada, mas o controle Panel será renderizado como a <div>.

Mais informações nos fóruns do ASP.NET

ecleel
fonte
1
Esta é uma excelente explicação detalhada. Eu só precisava ver por que essas tags foram usadas onde. o desenvolvedor de um módulo (agora desapareceu misteriosamente :)) apenas os cria dinamicamente no código por trás. Eu nunca os usei antes, tendo sido um cara de front-end de JavaScript nos últimos 7 anos. Obrigado pela grande contribuição.
User1585204
5

Eu bug estranho * no visual studio 2010, se você colocar controles dentro de um espaço reservado, ele não os renderiza no modo de exibição de design.

Isto é especialmente verdade para os rótulos Hidenfields e Empty.

Eu adoraria usar espaços reservados em vez de painéis, mas odeio o fato de não poder colocar outros controles dentro de espaços reservados em tempo de design na GUI.

George Filippakos
fonte
5
As pessoas ainda usam o modo de exibição de design? ;)
Matthew Lock
2
haha - Eu desisti de usá-lo anos atrás, mas MS ainda não corrigir o erro
George Filippakos
Ainda estou esperando que isso seja corrigido!
Nikki Punjabi
1

Como mencionado em outras respostas, o Painel gera um <div>em HTML, enquanto o PlaceHolder não. Mas há muitas outras razões pelas quais você pode escolher uma delas.

Por que um PlaceHolder?

Como ele não gera nenhuma tag própria, você pode usá-lo com segurança dentro de outro elemento que não possa conter um <div>, por exemplo:

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

Você também pode usar um PlaceHolder para controlar a Visibilidade de um grupo de Controles sem envolvê-lo em um <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>

Por que um painel

Ele gera o seu próprio <div>e também pode ser usado para agrupar um grupo de controles. Mas um painel tem muito mais propriedades que podem ser úteis para formatar seu conteúdo:

<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>

Mas o recurso mais útil é a DefaultButtonpropriedade Quando o ID corresponde a um botão no painel, ele aciona uma postagem de formulário com validação quando enterpressionada dentro de uma caixa de texto. Agora, um usuário pode enviar o formulário sem pressionar o botão.

<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>

Experimente o trecho acima pressionando enterdentroTextBox1

VDWWD
fonte