web-dev-qa-db-fra.com

Pourquoi la mise en forme du code Visual Studio ne fonctionne-t-elle pas correctement pour le balisage Razor?

Ou, devrais-je plutôt demander, quand le formatage du code VS fonctionnera-t-il correctement pour le balisage Razor? Le formatage fonctionne pour la plupart des structures, mais il semble s'étouffer avec les blocs "si". Le code ci-dessous est tel qu'il est formaté par VS. Il est très facile de résoudre ce cas, avec un tiret de plus, mais j'ai bien accepté le formatage dans une utilisation quotidienne, et j'aime l'utiliser souvent pour la majeure partie de mon code, donc je préfère éviter le formatage manuel si possible. Pour le moment, je le laisse tel que VS le formate.

@{ 
    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;" })
    }
 }

Je pense qu'il est important pour la lisibilité que, par exemple dans ce qui précède, le corps du bloc if est en retrait, en plus d'être plus joli.

70
ProfK

Veillez à configurer l'éditeur pour qu'il utilise des espaces et non des tabulations. L'éditeur semble complètement perdre la tête lorsque des onglets sont utilisés. C'est dommage car tous ces caractères d'espace se retrouvent dans la sortie HTML réelle, augmentant considérablement la taille du transfert de données. Ce que je fais, c'est compléter manuellement le formatage automatique au fur et à mesure que je tape. Pas idéal, mais j'espère que Microsoft aura compris cela pour le prochain service pack.

42
Charles Burns

J'ai trouvé une "solution" qui vous permet de continuer à utiliser l'indentation des onglets et d'avoir un formatage correct. C'est plus un modèle. La clé est d'utiliser des blocs de code de rasoir au lieu du code en ligne.

Par exemple, remplacez ce qui suit:

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

avec:

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

Ce dernier formatera correctement, mais pas le premier.

Gardez à l'esprit que la mise en forme n'est pas parfaite, mais c'est mieux qu'avant.

13
Josh Mouch

Cela ne fonctionne pas correctement dans tous les cas car c'est un problème difficile à résoudre. Essentiellement, vous avez 3 éditeurs différents (HTML, C # et Razor) interagissant tous sur le même tampon de texte. Il y a des cas (comme celui-ci) où les interactions ont des bugs. Mais nous travaillons sur l'amélioration de l'éditeur pour la prochaine version de Razor.

8
marcind

Une meilleure alternative ici (plutôt que d'utiliser des espaces pour les tabulations), est de changer le retrait du bloc pour HTML et C #/VB en "Block" au lieu de "Smart". Ce n'est pas une solution complète, mais l'OMI est une solution de contournement beaucoup moins pénible que d'utiliser des espaces!

5
Derek Kalweit

J'ai trouvé une autre solution pour cela. Sélectionnez simplement tout le code dans le fichier, cliquez sur Maj + onglet pour supprimer tous les onglets avant le code, copiez et collez-le. Visual studio formate automatiquement le code. Travailler sur le fichier VS 2013 .cshtml

4
Sidron

Dans mon cas, il s'agissait de redéfinir les options de formatage.

Si vous utilisez Reshaper et obtenez ce problème, essayez ceci ...

Resharper >> Options >> Razor >> Editor & Formatting >> Décochez "Auto-format on enter"

3
Danny Law

Je sais que ce n'est pas vraiment la réponse que vous cherchez, mais j'ai utilisé WriteLiteral pour contourner mes problèmes de formatage.

Par exemple, lorsque j'écris:

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

Visual Studio essaie de le changer en:

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

Ce qui provoque une erreur de la page.

Si vous utilisez WriteLiteral, vous pouvez tromper le formateur en ignorant la ligne mais ce n'est pas joli:

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

En ce moment, je suis sur VS2013 ASP.NET MVC 5 et j'ai toujours ce problème. Ce que j'ai trouvé très utile est de mettre la première expression sur la même ligne où se trouve le symbole de bloc d'ouverture (@{). De cette façon, le formatage du code du rasoir produit un bien meilleur résultat. Voici les cas avant et après:

[~ # ~] avant [~ # ~]

**BEFORE**

[~ # ~] après [~ # ~]

enter image description here

0

Je travaille avec VS2017 15.9.2 et j'ai toujours le problème.
.

Pas de solution, mais une courte mise à jour:

Il semble que le problème soit résolu partiellement dans Visual Studio 2019 version 16.0 Preview 2.1
Lien vers MS pour le problème

0
FredyWenger