Взгляните на следующий код ASP.NET:

<%@ Page Language="C#" %>
<!doctype html>
<html>
    <head>
        <title></title>
    </head>
    <body>
        <p><%Response.Write("This is sentence 1.");%> <%Response.Write("This is sentence 2.");%></p>
    </body>
</html>

Я ожидал, что он создаст короткий абзац, объединив две строки вместе с пробелом между ними (обратите внимание на белый символ между <%Response.Write("This is sentence 1.");%> и <%Response.Write("This is sentence 2.");%>). Однако выходной HTML-код, который я получаю от IIS 7.5:

<!doctype html>
<html>
    <head>
        <title></title>
    </head>
    <body>
        <p>This is sentence 1.This is sentence 2.</p>
    </body>
</html>

В котором нет пробелов между предложениями. Интересно, что если я помещу пробел во второе предложение:

<%@ Page Language="C#" %>
<!doctype html>
<html>
    <head>
        <title></title>
    </head>
    <body>
        <p><%Response.Write("This is sentence 1.");%><%Response.Write(" This is sentence 2.");%></p>
    </body>
</html>

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

Это ожидаемое поведение или я что-то делаю не так?

ОБНОВИТЬ:

VDWWD указывает на интересное замечание; если я использую <%="..."%> вместо <%Response.Write("...");%>, пробелы действительно переносятся в HTML. Но это заставляет меня еще больше почесать голову, потому что это работает в моем упрощенном тестовом примере, опубликованном выше, но не в моем фактическом варианте использования, который выглядит примерно так:

...
<p><%=TextoWeb("Ponencias", "QuieresSubirTuPonencia?")%><%
var InicioPonencias = Sesión.ElementoTimelinePorNombre("INICIO PONENCIAS");
if (DateTime.Today < InicioPonencias.Fecha) {
    %> <%=TextoWeb("Ponencias", "TextoAntesAperturaPonencias", InicioPonencias.Fecha.ToLongDateHtml(Sesión.Cultura))%><%
}
%></p>
...

Извините за испанские и нестандартные расширения. Функция TextoWeb извлекает некоторый локализованный текст по категории и имени в соответствии с языком создаваемой страницы, Sesión.ElementoTimelinePorNombre извлекает некоторый элемент временной шкалы по имени, а .ToLongDateHtml(System.Globalization.CultureInfo) выполняет высокоуровневое форматирование для определенного языка даты, чтобы добавить такие вещи, как порядковые указатели. Цель этого конкретного фрагмента кода - добавить предложение к существующему абзацу, но только если текущая дата раньше определенной даты.

Дело в том, что я использую <%=(...)%> вместо <%Response.Write(...);%>, но пробел не переносится в HTML.

1
Carvo Loco 14 Мар 2018 в 13:54

2 ответа

Лучший ответ

Вы можете использовать объект HTML, который является &#32; для обычного пространства, или более запоминающийся &nbsp; для неразрывного пробела, если это желательно.

Я не знаю точного механизма удаления, но, скорее всего, это как-то связано с порядком, в котором компилируется cshtml. Удаление пробелов из пустого тега, который движок видит как <p> </p> перед заполнением, было бы ожидаемым поведением.

2
j4nw 14 Мар 2018 в 12:01

Не используйте Response.Write. Тогда есть место.

<%= "This is sentence 1." %> <%= "This is sentence 2." %>

Обновить

Вероятно, вы не получите пробела, потому что вы разделили <% %> между встроенным кодом. Компилятор делает его одной строкой. Попробуйте сделать операторы if в коде позади для более чистого aspx. Или вы тройной оператор, там тоже есть пробел.

<p><%=TextoWeb("Ponencias", "QuieresSubirTuPonencia?YYY")%> <%= DateTime.Today < DateTime.Now ? TextoWeb("xxxPonencias", "QuieresSubirTuPonencia?YYY") : "" %></p>
1
VDWWD 14 Мар 2018 в 11:32