asp.net mvc бритва дополнительное пространство - PullRequest
29 голосов
/ 26 ноября 2010

Razor вставляет дополнительное пространство между текстовыми блоками.Я хочу отобразить список следующим образом: «1, 2, 3», но получить «1, 2, 3».

@for (int i = 1; i < 3; i++)
{
  <text>@i</text>
  if (i != 2)
  {
    <text>, </text>
  }
}

Есть ли способы удалить это дополнительное пространство?

Ответы [ 5 ]

20 голосов
/ 30 августа 2011

Поскольку это все еще проблема с тегом <text> в MVC 3 RTM + Tools Update, и это может быть настоящей головной болью, альтернатива подходу eddiegroves, заключающемуся в удалении пробелов из форматирования кода, состоит в том, чтобы избежать использованиятега <text> в целом.

Во-первых, здесь переписан исходный код, который воспроизводит проблему и фактически выводит «1, 2, 3»:

    @for (int i = 1; i <= 3; i++) {
      @i
      if (i < 3) {
        <text>, </text>
      }
    }

Вотчетыре альтернативы, которые печатают «1, 2, 3» вместо «1, 2, 3», но сохраняют форматирование кода, используя @something вместо <text>.

Решение # 1: Использование @ («»)

@for (int i = 1; i <= 3; i++) {
    @i
    if (i < 3) {
        @(", ")
    }
}

Решение № 2: Использование @ var

@for (int i = 1; i <= 3; i++) {
    var s = i < 3 ? ", " : null;
    @i @s
}

Решение № 3: Использование @ (выражение)

@for (int i = 1; i <= 3; i++) {
    @i @(i < 3 ? ", " : null)
}

Решение № 4: Использование @helpers

@helper Item(int index) {
    @index
}

@helper Separator(int index, int count) {
    if (index < count) {
        @(", ")
    }
}

@for (int i = 1; i <= 3; i++) {
    @Item(i) @Separator(i, 3)
}

Последний пример явно избыточен для примера, но может быть полезен для более сложных элементов и разделителей.

18 голосов
/ 05 января 2012

Вы можете использовать @ Html.Raw.Код более читабелен, и у вывода нет лишних пробелов

@for (int i = 1; i < 3; i++)
{
  @Html.Raw(i)
  if (i != 2)
  {
    @Html.Raw(", ")
  }
}
10 голосов
/ 26 ноября 2010

Я полагаю , что в ASP.NET Razor RC есть проблема, которая, к сожалению, рассматривает пробелы внутри "контекста кода" как буквальный пробел для записи в ответ.

Приведенный выше пример «исправлен» путем удаления пробелов внутри блоков кода:

@for (int i = 1; i < 3; i++)
{
  <text>@i</text>if (i != 2)
{
<text>, </text>
}
}

Или более аккуратно:

@for (int i = 1; i < 3; i++)
{
  <text>@i</text>if(i != 2){<text>, </text>}
}

Следуя этой теме на asp.net На сайте есть обсуждение, которое имеет аналогичную проблему, и Эндрю Нурс отвечает

Эта ошибка была зарегистрирована и будет рассмотрена для RTM.

Так что если это - это та же проблема, надеюсь, она исправила список.

Эта ошибка не сделала RTM

7 голосов
/ 26 ноября 2010

Я бы, вероятно, написал для этого специальный хелпер:

public static MvcHtmlString RenderNumbers(this HtmlHelper htmlHelper, int count)
{
    var text = string.Join(", ", Enumerable.Range(1, count).ToArray());
    return MvcHtmlString.Create(text);
}

, а затем использовал бы его на мой взгляд:

@Html.RenderNumbers(3);
1 голос
/ 29 августа 2013

Любое из следующего должно работать, в зависимости от того, откуда на самом деле берутся ваши значения:

@string.Join(", ", myList)
@string.Join(", ", 1, 2, 3)
@string.Join(", ", Enumerable.Range(1, 3))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...