为什么Visual Studio代码格式不能正确用于Razor标记?


71

或者,我宁愿问一下,什么时候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块的主体要缩进,除了看起来更好。


2
请对此用户语音错误进行投票:visualstudio.uservoice.com/forums/121579-visual-studio/…–
NickG

2
不,它在Update 3中未解决,我仍然有这个问题,我在2015年使用Update3。对我来说,即使没有助手,Intellisense也被完全塞住了。它是如此烦人,我要作全面切换到.NET的核心时,我可以和使用Project骑士(JetBrains公司).....
瑞恩·曼

4
4年,这仍然是一个问题...:o
GazB

12
现在已经6年了,但在VS2017中仍然是一个问题...
Rory McCrossan

1
不知何故仍然是一个问题,这太糟糕了。
杰西卡

Answers:


42

确保将编辑器设置为使用空格字符,而不使用制表符。使用选项卡时,编辑器似乎完全失去了理智。很遗憾,因为所有这些空格字符最终都出现在实际的HTML输出中,从而大大增加了数据传输的大小。我要做的是在键入时手动补充自动格式。这并不理想,但是希望微软能够在下一个Service Pack中找到解决方案。


28
非常烦人-我讨厌使用空格进行缩进。不过,它确实有效,因此谢谢您的建议。
Bobson

13
关于空格与标签的争论几乎不是封闭的。这是一个偏好问题。我更喜欢标签,但不是由于文件大小。这两个首选项都有论点,例如lea.verou.me/2012/01/why-tabs-are-clearly-superior
Charles Burns

2
它最终出现在HTML输出中的事实实际上并不会增加数据传输的大小。如今,大多数Web服务器和浏览器都使用压缩,因此重复的空间实际上并没有增加太多。
Vincent McNabb 2012年

12
仍然是Visual Studio 2015中的错误:(((
Anshul

3
greatly increasing the data transfer size您已关闭服务器压缩?否则,这是非常名义上的
埃里克飞利浦

14

我找到了一个“解决方案”,可让您继续使用制表符缩进并设置正确的格式。这更像是一种模式。关键是使用剃刀代码块而不是内联代码。

因此,例如,替换以下内容:

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

与:

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

后者将正确格式化,但前者则不会。

请记住,格式并不完美,但是比以前更好。


我发现自己在编写很长的流利方法链时需要使用DevExpress网格。
ProfK

+10000。很棒的建议,效果很好。 @{ if(something) { // regular c# comments too... } }
亚伦·休顿

理论上的好主意,但不幸的是在VS2017中对我不起作用
Rory McCrossan 2017年

同样适用于VS 2019。
勒内·

8

它不是在所有情况下都能正常工作,因为这是一个很难解决的问题。本质上,您有3个不同的编辑器(HTML,C#和Razor)都在同一个文本缓冲区上进行交互。在某些情况下(如这种情况),交互存在错误。但是我们正在努力改进Razor下一版本的编辑器。


41
我想选择完全不格式化HTML / Razor的选项。它似乎永远无法正常工作,有时会以破坏页面的方式重新格式化我的HTML(有时添加空格会破坏布局-grr)。我想如果所有错误都可以解决,并且产生干净的html / razor,对此我会感到满意,但是我猜这太复杂了,并且总会有错误。同样,最好为Razor和C#使用不同的格式。我通常将花括号放在C#中的单独一行上,而在Razor中放在同一行上。
布莱恩

2
已经一年多了,我仍然每天都对这些错误感到沮丧。VS 2010计划了什么,还是VS 2012了?
user247702

1
@Stijn最近发布了一个新版本的MVC(包括新的Razor工具)(asp.net/mvc)。然而,你将不得不升级项目中使用MVC 4.目前,我们没有任何计划出货编辑错误修复剃刀在MVC 3
marcind

7
@marcind我正在看Visual Studio 2012中的MVC 4项目,如果您使用制表符而不是空格(在ifs中获得空格而不是制表符,请使用开括号和闭括号),它仍然无法正常工作。
Tor-Erik 2012年

1
在这种情况下,当您使用制表符缩进而不是空格时,问题是它在X.tab之前的“ @if”前面插入了X个空格。我看不到修改内部Visual Studio代码的困难,这样做可以查找要使用的缩进字符。其余逻辑似乎已经存在。
乔什·穆奇

6

此处更好的替代方法(而不是使用制表符使用空格)是将HTML和C#/ VB的块缩进更改为“块”,而不是“智能”。这不是一个完整的解决方案,但是与使用空格相比,IMO的痛苦要小得多!


这会给您完美的格式吗?还是像我上面的解决方案那样,仅一步之遥?我会尝试一下,至少!:)
Josh Mouch

你摇滚。这似乎有所帮助。
尼古拉斯·彼得森2014年

不错,简单的解决方案。由于某种原因,我的设置为“无”,因此更改为“智能”实际上对我有用。至少这个答案告诉我在哪里看!
jon_two

4

我为此找到了另一个解决方案。只需选择文件中的所有代码,单击Shift +选项卡即可删除代码之前的所有选项卡,然后将其复制并粘贴。Visual Studio自动格式化代码。在VS 2013 .cshtml文件上工作


我尝试过,但文字将是小写字母
AnhBảy,2017年

3

就我而言,这是重载者优先使用的格式化选项。

如果您使用整形器并遇到此问题,请尝试此...

Resharper >>选项>>剃刀>>编辑器和格式>>取消选中“输入时自动格式化”


2

我知道这并不是您要找的答案,但是我已经使用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>

0

现在,我使用的是VS2013 ASP.NET MVC 5,但仍然存在该问题。我发现非常有帮助的是将第一个表达式放在开头块符号为(@{)的同一行上。这样,剃刀代码格式化将产生更好的结果。以下是之前和之后的情况:

之前

**之前**

在此处输入图片说明


0

我使用VS2017 15.9.2仍存在问题。
将编辑器设置更改为使用空格而不是制表符后,编辑时的行为(例如,复制-粘贴代码行)会更好,但“格式化文档”仍会在每次调用时添加错误的缩进。

没有解决方案,但有一个简短的更新:

看来问题已在Visual Studio 2019版本16.0预览版2.1中得到部分解决
了该问题

进一步的简短更新:
我发现了一个(不好的和丑陋的)解决方法(将整个代码写到剃刀控件的一行中。您可以在此处找到详细信息,以解决错误的缩进剃刀控件的方法。


1
微软撒谎或无能为力。在VS2019 v16.7.5中这仍然是一个问题。资料来源:我,现在。
罗里·麦克罗斯

感谢您的更新-(坏消息,但是很高兴知道)
FredyWenger

-2

我建议您通过注释粘贴到的代码段来防止自动格式化触发。这样,事情就不会在粘贴时破裂。


1
在VS2013中无法实现-无法在cshtml文件中禁用粘贴格式-尝试了所有方法...:o(
Miros
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.