web-dev-qa-db-ja.com

Visual StudioのコードフォーマットがRazorマークアップに対して正しく機能しないのはなぜですか?

または、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ブロックの本体がインデントされています。

70
ProfK

タブではなくスペース文字を使用するようにエディターを設定してください。エディターは、タブが使用されると完全に気を失うようです。これらのスペース文字はすべて実際のHTML出力になり、データ転送サイズが大幅に増加するため、これは残念です。私がしていることは、入力時に自動フォーマットを手動で補完することです。理想的ではありませんが、Microsoftが次のサービスパックでこれを理解することを願っています。

42
Charles Burns

タブのインデントを使用し続けることができ、正しい書式設定ができる「ソリューション」を見つけました。それは単なるパターンです。重要なのは、インラインコードの代わりにカミソリコードブロックを使用することです。

したがって、たとえば、次を置き換えます。

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

で:

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

後者は正しくフォーマットされますが、前者はフォーマットされません。

フォーマットは完全ではありませんが、以前よりも優れていることに注意してください。

13
Josh Mouch

解決するのが難しい問題であるため、すべての場合に正しく機能するわけではありません。基本的に、3つの異なるエディター(HTML、C#、およびRazor)があり、すべて同じテキストバッファー上で対話します。相互作用にバグがある場合(このような)がいくつかあります。しかし、Razorの次のリリースに向けてエディターの改善に取り組んでいます。

8
marcind

ここでのより良い代替方法は、(タブにスペースを使用するのではなく)HTMLおよびC#/ VBのブロックインデントを「スマート」ではなく「ブロック」に変更することです。これは完全な解決策ではありませんが、IMOはスペースを使用するよりもはるかに苦痛の少ない回避策です!

5
Derek Kalweit

これに対する別の解決策を見つけました。ファイル内のすべてのコードを選択し、Shift + Tabをクリックしてコードの前のすべてのタブを削除し、コピーして貼り付けます。 Visual Studioはコードを自動的にフォーマットします。 VS 2013 .cshtmlファイルで作業する

4
Sidron

私の場合、それはフォーマットオプションを上書きする再シャーパーでした。

Reshaperを使用してこの問題が発生する場合は、これを試してください...

Resharper >>オプション>> Razor >> Editor&Formatting >>「Enter on auto-format」のチェックを外します

3
Danny Law

実際にあなたが探している答えではないことは知っていますが、フォーマットの問題を回避するために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>
2
Craig Poole

現在、私はVS2013 ASP.NET MVC 5を使用していますが、まだその問題があります。私が非常に役立つことがわかったのは、開始ブロック記号が(@{)。そうすれば、カミソリのコードの書式設定がはるかに良い結果を生み出します。前後のケースは次のとおりです。

[〜#〜] before [〜#〜]

**BEFORE**

[〜#〜] after [〜#〜]

enter image description here

0

VS2017 15.9.2を使用していますが、まだ問題があります。
].

解決策はありませんが、短い更新:

問題はVisual Studio 2019バージョン16.0プレビュー2.1で部分的に解決されたようです
問題のMSへのリンク

0
FredyWenger