Почему форматирование кода Visual Studio не работает правильно для разметки Razor?

Или, должен ли я спрашивать, когда будет корректно работать форматирование VS для разметки Razor? Форматирование работает для большинства структур, но, похоже, блокирует блоки "if". Код ниже, так как он отформатирован VS. Очень легко исправить этот случай с еще одним отступом, но я хорошо принял форматирование в повседневном использовании и хотел часто использовать его для большей части моего кода, поэтому я предпочел бы избежать ручного форматирования, если это возможно. Прямо сейчас я просто оставляю его, поскольку VS его форматирует.

@{ 
    if (User.Identity.IsAuthenticated)
    {
    <text>Hello </text>
    @Html.Display("@ViewBag.UserName") <text> - </text>
    @Html.ActionLink("Sign Out", "LogOff", "Account", null, new { style = "font-weight: bold;" })
    }
 }

Я думаю, что это важно для читаемости, например, в вышесказанном, тело блока if имеет отступы, кроме того, что вы выглядите лучше.

Ответ 1

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

Ответ 2

Я нашел одно "решение", которое позволяет вам продолжать использовать отступ вкладок и иметь правильное форматирование. Это скорее образец. Ключ состоит в том, чтобы использовать блоки кода бритвы вместо встроенного кода.

Так, например, замените следующее:

<div>
    <div>
        @if (true)
        {
            <b>Hi</b>
        }
    </div>
</div>

с:

<div>
    <div>
        @{
            if (true)
            {
                <b>Hi</b>
            }
        }
    </div>
</div>

Последний будет отформатировать правильно, но первый не будет.

Имейте в виду, что форматирование не является совершенным, но оно лучше, чем раньше.

Ответ 3

Это не работает правильно во всех случаях, потому что это трудная проблема. По сути, у вас есть 3 разных редактора (HTML, С# и Razor), которые взаимодействуют в одном текстовом буфере. Есть несколько случаев (например, этот), где взаимодействия имеют ошибки. Но мы работаем над улучшением редактора для следующего выпуска Razor.

Ответ 4

Лучшая альтернатива здесь (вместо использования пробелов для вкладок) заключается в том, чтобы изменить отступ блока для HTML и С#/VB на "Block" вместо "Smart". Это не полное решение, но IMO - гораздо менее болезненная работа, чем использование пробелов!

Ответ 5

Я нашел другое решение для этого. Просто выберите весь код в файле, нажмите Shift + tab, чтобы удалить все вкладки перед кодом, скопировать и вставить его. Visual studio автоматически форматирует код. Работа над файлом VS 2013.cshtml

Ответ 6

В моем случае это было переопределение параметров форматирования.

Если вы используете reshaper и получаете эту проблему, попробуйте это...

Resharper → Параметры → Razor → Редактор и форматирование → Untick "Автоматический формат при вводе"

Ответ 7

Я знаю, что это не тот ответ, который вы ищете, но я использовал WriteLiteral, чтобы обойти мои проблемы с форматированием.

Например, когда я пишу:

<div>
    @foreach (var item in Model) {    
        if (condition) {
            @:</div><div>
        }
        <a href="@item.Url">@item.Label</a>
    }
</div>

Visual Studio пытается изменить его на:

<div>
    @foreach (var item in Model) {    
        if (condition) {
            @:
        </div><div>
        }
        <a href="@item.Url">@item.Label</a>
    }
</div>

Это приводит к ошибке страницы.

Если вы используете WriteLiteral, вы можете обмануть форматирование, игнорируя строку, но это не очень хорошо:

<div>
    @foreach (var item in Model) {    
        if (condition) {
            WriteLiteral("</div><div>");
        }
        <a href="@item.Url">@item.Label</a>
    }
</div>

Ответ 8

Сейчас я на VS2013 ASP.NET MVC 5, и у меня все еще есть эта проблема. Мне было очень полезно разместить первое выражение в той же строке, где символ начального блока (@{). Таким образом, форматирование кода бритвы дает гораздо лучший результат. Вот до и после:

перед

** ПЕРЕД **

после

введите описание изображения здесь

Ответ 9

Я работаю с VS2017 15.9.2 и до сих пор проблема.
После изменения настроек редактора для использования пробелов вместо вкладок поведение при редактировании (например, копирование - вставка строк кода) становится намного лучше, но "Формат документа" по-прежнему добавляет неправильные отступы при каждом вызове.

Нет решения, но короткое обновление:

Похоже, проблема частично решена в Visual Studio 2019 версии 16.0 Preview 2.1
Ссылка на MS для выпуска

Ответ 10

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