Используя Panel или PlaceHolder

152

В чем разница между <asp:Panel >и <asp:PlaceHolder >в ASP.NET?

Когда вы должны использовать один над другим?

p.campbell
источник

Ответы:

161

Панель расширяется до span (или div) с содержимым внутри. Заполнитель - это просто заполнитель, который заменяется тем, что вы в него вставили.

Стивен Роббинс
источник
19
Панель становится DIV
mbillard
4
Он также может стать Span, в зависимости от версии ASP.Net и браузера, который он отображает.
Стивен Роббинс
9
Мех, не начинайте меня с BrowserCaps - он также может стать таблицей из одной ячейки в .Net 1.1 в браузерах "нижнего уровня".
Жаф - Бен Дугид
6
Хех, я пытался заставить рендеринг таблиц нижнего уровня забыться ... спасибо, что вернул это обратно :-)
Стивен Роббинс
1
@Protectorone: комментарии выше касаются панелей, а не заполнителей.
Брайан
63

Заполнитель не отображает никаких тегов для себя, поэтому он отлично подходит для группировки контента без дополнительных внешних тегов HTML.

В Panel есть внешние HTML-теги, но есть некоторые интересные дополнительные свойства.

  • BackImageUrl: получает / устанавливает URL-адрес фонового изображения для панели.

  • HorizontalAlign: получает / устанавливает
    горизонтальное выравнивание содержимого родителя

  • Wrap: получает / устанавливает,
    переносится ли содержимое панели

Существует хорошая статья на startvbnet здесь .

Рэй Бойсен
источник
15
Еще одна интересная особенность asp: Panel - это то, что она имеет свойство DefaultButton, сообщающее ей, какую кнопку нажимать, если пользователь нажимает клавишу ввода на своей клавиатуре. Удобно, если у вас есть несколько панелей и кнопок на одной странице, которые должны работать с кнопкой ввода.
Алекс Йорк
1
@Marko после борьбы с пользовательским управлением наследством, я согласен
drzaus
В 2009 году, когда WebForms был де-факто .NET-разработчиком ASP.NET, тогда да. В декабре 2012 года почти через 4 года, вероятно, нет. Странный комментарий
Рэй Бойсен
1
ссылка на startvbnet не работает.
mmcglynn
1
То же, что мои комментарии выше - спасибо за предоставление очень ценных деталей. Это помогло понять, почему они используются в коде, а не в других решениях для модуля DNN, который я пытаюсь обновить.
user1585204
36

Управление PlaceHolder

Используйте элемент управления PlaceHolder в качестве контейнера для хранения серверных элементов управления, которые динамически добавляются на веб-страницу. Элемент управления PlaceHolder не создает видимых результатов и используется только как контейнер для других элементов управления на веб-странице. Вы можете использовать Control.Controlsколлекцию для добавления, вставки или удаления элемента управления в элементе управления PlaceHolder.

Панель управления

Элемент управления Panel является контейнером для других элементов управления . Это особенно полезно, когда вы хотите создать элементы управления программно, скрыть / показать группу элементов управления или локализовать группу элементов управления.

Это Directionсвойство полезно для локализации содержимого элемента управления Panel для отображения текста для языков, написанных справа налево, таких как арабский или иврит.

Элемент управления Panel предоставляет несколько свойств, которые позволяют настраивать поведение и отображение его содержимого. Используйте BackImageUrсвойство l для отображения пользовательского изображения для элемента управления Panel. Используйте ScrollBarsсвойство, чтобы указать полосы прокрутки для элемента управления.

Небольшие различия при рендеринге HTML: элемент управления PlaceHolder не будет отображать ничего, но элемент управления Panel будет отображаться как <div>.

Больше информации на форумах ASP.NET

ecleel
источник
1
Это отличное подробное объяснение. Мне просто нужно было понять, почему эти теги были использованы где. разработчик модуля (теперь загадочно исчезнувший :)) просто динамически создает их в коде позади. Я никогда не использовал их раньше, будучи парнем из JavaScript на протяжении последних 7 лет или около того. Спасибо за отличный вклад.
user1585204
5

Странная ошибка * в Visual Studio 2010: если вы помещаете элементы управления в Placeholder, они не отображаются в режиме просмотра дизайна.

Это особенно верно для меток Hidenfields и Empty.

Я хотел бы использовать заполнители вместо панелей, но я ненавижу тот факт, что не могу поместить другие элементы управления в заполнители во время разработки в GUI.

Джордж Филиппакос
источник
5
Люди все еще используют режим просмотра дизайна? ;)
Мэтью Лок
2
ха-ха - я отказался от его использования несколько лет назад, но MS до сих пор не исправил ошибку
Джордж Филиппакос
Все еще жду, пока это исправят!
Никки Пенджаби
1

Как упоминалось в других ответах, Panel генерирует <div>в HTML, а PlaceHolder - нет. Но есть гораздо больше причин, по которым вы можете выбрать любой из них.

Почему PlaceHolder?

Поскольку он не генерирует собственный тег, вы можете безопасно использовать его внутри другого элемента, который не может содержать <div>, например:

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

Вы также можете использовать PlaceHolder для управления видимостью группы элементов управления, не помещая ее в <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>

Почему панель

Он генерирует его самостоятельно <div>и может также использоваться, чтобы обернуть группу Контолов. Но у Panel гораздо больше свойств, которые могут быть полезны для форматирования ее содержимого:

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

Но самая полезная особенность - DefaultButtonсобственность. Когда идентификатор соответствует кнопке на панели, он запускает публикацию формы с проверкой при enterнажатии внутри TextBox. Теперь пользователь может отправить форму, не нажимая кнопку.

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

Попробуйте приведенный выше фрагмент, нажав enterвнутриTextBox1

VDWWD
источник