为什么Visual Studio代码格式化无法正确处理Razor标记?

79

或者,我应该问的是,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语句块的主体需要进行缩进,这不仅使代码更美观,而且更易读。


5
四年过去了,这仍然是一个问题... :o - GazB
14
现在已经过去了6年,但在VS2017中仍然存在问题... - Rory McCrossan
2
某种程度上仍然存在问题,这太糟糕了。 - Jessica
5
现在距离在VS2019中出现问题已经快8年了,但问题仍然存在。 - Rory McCrossan
7
现在已经快10年了,这仍然是一个问题。.Net 5(Core的未来)(VS2019)。 - Christopher Bonitz
显示剩余10条评论
11个回答

43

请确保将编辑器设置为使用空格字符而不是制表符。当使用制表符时,编辑器似乎会完全失去理智。这很遗憾,因为所有这些空格字符最终都会出现在实际的HTML输出中,大大增加了数据传输大小。

我的做法是在打字时手动补充自动格式化。虽然不是理想的方法,但希望微软公司能在下一个服务包中解决这个问题。


29
非常让人烦恼 - 我讨厌使用空格来缩进。但它确实有效,所以感谢您的建议。 - Bobson
13
空格和制表符的争论并没有结束。这是一种个人偏好。我喜欢制表符,但不是因为文件大小的原因。对于双方的喜好都有争议,比如:http://lea.verou.me/2012/01/why-tabs-are-clearly-superior/。 - Charles Burns
2
事实上,它最终以HTML输出的事实并没有显著增加数据传输大小。现在大多数Web服务器和浏览器都使用压缩,因此重复的空格并不会增加太多负担。 - Vincent McNabb
12
Visual Studio 2015 仍存在一个 bug :((( - Anshul
3
您关闭了服务器压缩功能吗?否则数据传输量的增加并不算太大...... - Erik Philips
显示剩余3条评论

17

我发现了一种“解决方案”,它允许您继续使用制表符缩进并具有正确的格式。这更像是一种模式。关键是要使用Razor代码块而不是内联代码。

所以例如,将以下内容替换为:

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

随着:

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

后者的格式会正确显示,而前者则不会。

请记住,格式可能不是完美的,但比以前好了。


当我为DevExpress网格编写非常长的流畅方法调用链时,我发现了这一点。 - ProfK
2
太棒了,这个建议非常好,运行得很顺利。@{ if(something) { // 这里也可以使用普通的C#注释... } } - Aaron Hudon
理论上是个好主意,但遗憾的是在VS2017中对我不起作用。 - Rory McCrossan
同样适用于VS 2019。 - René
1
哎呀...这个变通方法真的值得上Stack Overflow看看...谢谢你的分享 :) - Chris Keller

8

由于它是一个难以解决的问题,因此在某些情况下无法正确工作。基本上,您有3个不同的编辑器(HTML、C#和Razor),所有这些编辑器都在同一文本缓冲区上进行交互。有一些情况(比如这个例子)其中交互存在错误。但我们正在努力改进Razor的下一个版本的编辑器。


41
我希望有一个选项可以完全不格式化我的HTML/Razor。这个功能似乎从来没有正常工作过,有时会以破坏页面的方式重新格式化我的HTML(有时添加空格会打破布局)。我想,如果所有的错误都能被解决,并且它能生成干净的HTML / Razor代码,那么我会很满意。但我猜这太复杂了,总会有错误。此外,在Razor和C#中使用不同的格式也很好。我通常在C#中将括号放在单独的一行,但在Razor中则与其他代码放在同一行。 - Brian
2
已经过去一年了,我每天仍然因为这些错误而感到沮丧。在VS 2010中有什么安排吗?还是重点放在VS 2012上? - user247702
1
@Stijn 最近发布了 MVC 的新版本(包括新的 Razor 工具)(http://www.asp.net/mvc)。但是,您需要升级您的项目以使用 MVC 4。我们目前没有计划为 MVC 3 中的 Razor 发布编辑器错误修复。 - marcind
7
我正在查看一个在Visual Studio 2012中的MVC 4项目,如果你使用制表符而不是空格(if语句的开放和关闭括号应该使用空格而不是制表符),它仍然无法正常工作。 - Tor-Erik
2
现在在VS2015更新2中变得更糟了。如果您关闭所有格式选项并粘贴代码或键入新的函数块,则所有代码都会左对齐。这让我感到非常恼火。“什么难度?” - Craig
显示剩余4条评论

7

一个更好的选择(而不是使用空格作为制表符),是将HTML和C#/VB的块缩进方式更改为“块”而不是“智能”。这并不是一个完全的解决方案,但在我看来,比使用空格要容易得多!


这是否给您带来了完美的格式?还是只是更接近一步,就像我上面的解决方案?至少我会尝试一下! :) - Josh Mouch
你真棒!那似乎有帮助。 - Nicholas Petersen
不错,简单明了的解决方案。由于某种原因,我的设置为“无”,所以将其更改为“智能”实际上对我有用。至少这个答案告诉了我该去哪里查找! - jon_two
这绝对是解决这个问题最简单的方法。我将HTML设置为“块”,将C#/VB设置为“智能”,以便在.cs文件中使用“智能”缩进。 虽然这样做会在.cshtml文件中保留奇怪的缩进,但至少会减少烦恼。谢谢@Derek - undefined

4
我找到了另一种解决方法。只需要选择文件中的所有代码,按 Shift + Tab 以删除代码前的所有制表符,然后复制并粘贴即可。Visual Studio 将自动格式化代码。适用于 VS 2013 .cshtml 文件。

我尝试了,但文本将会是小写。 - Anh Bảy

4
在我的情况下,是resharper覆盖了格式选项。
如果您正在使用reshaper并遇到此问题,请尝试以下操作...
Resharper >> 选项 >> Razor >> 编辑器和格式化 >> 取消选中“输入时自动格式化”。

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

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

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

似乎在Visual Studio 2019版本16.0预览版2.1中部分解决了该问题
链接到MS的问题

进一步简短的更新:
我已经找到了一个(不好且丑陋的)解决方法(将整个代码写入一个Razor控件中的一行)。 您可以在此处找到详细信息 修复错误缩进的Razor控件的解决方法


2
微软要么撒谎了,要么就是无能为力。这在VS2019 v16.7.5中仍然是一个问题。消息来源:我,就在此刻。 - Rory McCrossan
感谢更新 -(虽然是坏消息,但也好知道) - FredyWenger

0

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

之前

**BEFORE**

之后

enter image description here


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接