または、VSコードの書式設定がRazorマークアップで適切に機能するのはいつですか?書式設定はほとんどの構造で機能しますが、「if」ブロックで停止するようです。以下のコードは、VSによってフォーマットされたものです。インデントをもう1つ付けてこのケースを修正するのは非常に簡単ですが、私は日常の使用で書式設定をうまく受け入れ、コードの大部分で頻繁に使用したいので、可能な場合は手動で書式設定することを避けます。今は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ブロックの本体がインデントされています。
タブではなくスペース文字を使用するようにエディターを設定してください。エディターは、タブが使用されると完全に気を失うようです。これらのスペース文字はすべて実際のHTML出力になり、データ転送サイズが大幅に増加するため、これは残念です。私がしていることは、入力時に自動フォーマットを手動で補完することです。理想的ではありませんが、Microsoftが次のサービスパックでこれを理解することを願っています。
タブのインデントを使用し続けることができ、正しい書式設定ができる「ソリューション」を見つけました。それは単なるパターンです。重要なのは、インラインコードの代わりにカミソリコードブロックを使用することです。
したがって、たとえば、次を置き換えます。
<div>
<div>
@if (true)
{
<b>Hi</b>
}
</div>
</div>
で:
<div>
<div>
@{
if (true)
{
<b>Hi</b>
}
}
</div>
</div>
後者は正しくフォーマットされますが、前者はフォーマットされません。
フォーマットは完全ではありませんが、以前よりも優れていることに注意してください。
解決するのが難しい問題であるため、すべての場合に正しく機能するわけではありません。基本的に、3つの異なるエディター(HTML、C#、およびRazor)があり、すべて同じテキストバッファー上で対話します。相互作用にバグがある場合(このような)がいくつかあります。しかし、Razorの次のリリースに向けてエディターの改善に取り組んでいます。
ここでのより良い代替方法は、(タブにスペースを使用するのではなく)HTMLおよびC#/ VBのブロックインデントを「スマート」ではなく「ブロック」に変更することです。これは完全な解決策ではありませんが、IMOはスペースを使用するよりもはるかに苦痛の少ない回避策です!
これに対する別の解決策を見つけました。ファイル内のすべてのコードを選択し、Shift + Tabをクリックしてコードの前のすべてのタブを削除し、コピーして貼り付けます。 Visual Studioはコードを自動的にフォーマットします。 VS 2013 .cshtmlファイルで作業する
私の場合、それはフォーマットオプションを上書きする再シャーパーでした。
Reshaperを使用してこの問題が発生する場合は、これを試してください...
Resharper >>オプション>> Razor >> Editor&Formatting >>「Enter on auto-format」のチェックを外します
実際にあなたが探している答えではないことは知っていますが、フォーマットの問題を回避するために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>
VS2017 15.9.2を使用していますが、まだ問題があります。
].
解決策はありませんが、短い更新:
問題はVisual Studio 2019バージョン16.0プレビュー2.1で部分的に解決されたようです
問題のMSへのリンク