Взгляните на следующий код 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.
2 ответа
Вы можете использовать объект HTML, который является  
для обычного пространства, или более запоминающийся
для неразрывного пробела, если это желательно.
Я не знаю точного механизма удаления, но, скорее всего, это как-то связано с порядком, в котором компилируется cshtml. Удаление пробелов из пустого тега, который движок видит как <p> </p>
перед заполнением, было бы ожидаемым поведением.
Не используйте 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>
Похожие вопросы
Новые вопросы
c#
C # (произносится как «резкий») - это высокоуровневый, статически типизированный язык программирования с несколькими парадигмами, разработанный Microsoft. Код C # обычно нацелен на семейство инструментов и сред выполнения Microsoft .NET, включая, среди прочего, .NET Framework, .NET Core и Xamarin. Используйте этот тег для вопросов о коде, написанном на C # или в формальной спецификации C #.