Подтвердить что ты не робот

Остановить asp: PlaceHolder от удаления пробелов

Я столкнулся с каким-то странным поведением asp:PlaceHolder, он удаляет пробелы между asp:Literal внутри него.

Например, для этого кода:

<asp:PlaceHolder ID="PlaceHolder1" runat="server">
    <asp:Literal ID="Literal1" Text="aa" runat="server"></asp:Literal>
    <asp:Literal ID="Literal2" Text="bb" runat="server"></asp:Literal>
</asp:PlaceHolder>
<asp:Literal ID="Literal3" Text="cc" runat="server"></asp:Literal>
<asp:Literal ID="Literal4" Text="dd" runat="server"></asp:Literal>

Выход будет aabb cc dd.

Есть ли способ остановить его от удаления пробелов (а не путем добавления &nbsp; между литералами или Text="aa ")?

4b9b3361

Ответ 1

Самое элегантное решение - просто переопределить PlaceHolder:

using System.Web.UI;
using System.Web.UI.WebControls;

namespace CustomControls
{
    [ToolboxData("<{0}:Holder ID='Holder1' runat='server'></{0}:Holder>"), ControlBuilder(typeof(ControlBuilder))]
    public sealed class Holder: PlaceHolder
    {
    }
}

Ключ здесь используется ControlBuilder вместо PlaceHolderControlBuilder, который просто переопределяет его, чтобы всегда возвращать false для AllowWhiteSpaceLiterals.

Вы используете его как любой другой веб-элемент управления:

<%@ Register TagPrefix="asp" Namespace="CustomControls" %>
<asp:Holder runat="server">...</asp:Holder>

Ответ 2

Я придумал два решения:

Сначала: Чтобы заменить asp:PlaceHolder на asp:Panel. Недостатком является то, что вы получаете обертку div.

Второе: Чтобы поместить пустой комментарий HTML между literals

<asp:PlaceHolder ID="PlaceHolder1" runat="server">
    <asp:Literal ID="Literal1" Text="aa" runat="server"></asp:Literal><!>
    <asp:Literal ID="Literal2" Text="bb" runat="server"></asp:Literal>
</asp:PlaceHolder>

И да, <!> является законным комментарием HTML.

Ответ 3

Я бы либо окружал его, либо использовал метку asp: label, а не литерал. У вас будет намного больше контроля над тем, как он будет использоваться. С помощью span - дайте ему класс или id, и вы можете настроить его, чтобы он выглядел так, как вам нравится.

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

Третий вариант - создать промежуточную строку, которую вы можете привязать/использовать в качестве ввода в литерал. Это обеспечило бы aa bb в гарантированном формате.