为什么 VisualStudio 的代码格式设置不能适用于 Razor 标记?

或者,我应该问一下,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 块的主体是缩进的,而不仅仅是看起来更好。

35618 次浏览

It does not work correctly in all cases because it's a difficult problem to solve. Essentially you have 3 different editors (HTML, C#, and Razor) all interacting over the same text buffer. There are some cases (like this one) where the interactions have bugs. But we are working on improving the editor for the next release of Razor.

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

我找到了一个“解决方案”,它允许您继续使用制表符缩进并具有正确的格式。更像是一种模式。关键是使用剃须刀代码块代替内联代码。

例如,替换以下内容:

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

与:

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

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

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

这里的一个更好的选择(而不是使用空格作为制表符)是将 HTML 和 C #/VB 的块缩进改为“ Block”而不是“ Smart”。这不是一个完整的解决方案,但 IMO 是一个远远少于使用空间痛苦的工作解决方案!

I recommend you prevent automatic formatting to trigger by commenting the piece of code where you paste. This way things don't get broken on paste.

我知道这不是你想要的答案,但是我已经用 WriteLiteral 解决了我的格式问题。

例如,当我写道:

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

VisualStudio 试图将其更改为:

<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>

现在我使用的是 VS2013 ASP.NET MVC 5,我仍然有这个问题。我发现将第一个表达式放在开始块符号(@{)所在的同一行上很有帮助。这样,剃须刀代码格式化会产生更好的结果。以下是案件发生前后的情况:

之前

**BEFORE**

之后

enter image description here

在我的例子中,它是 resharper 重写格式选项。

如果您使用重塑和得到这个问题尝试这个..。

Resharper >> Options >> Razor >> Editor & Formatting >> Untick “Auto-format on enter”

我找到了另一个解决办法。只需选择文件中的所有代码,单击 Shift + 选项卡删除所有选项卡之前的代码,复制和粘贴它。Visual Studio 自动格式化代码。VS 2013的工作。Cshtml 文件

我用 VS201715.9.2工作,仍然有问题。
改变编辑器的设置,使用空格而不是制表符,编辑的行为(如复制粘贴代码行)更好,但“格式文档”仍然添加错误的缩进每次调用。

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

看来问题是 在 Visual Studio 2019版本16.0 Preview 2.1中解决了部分问题
链接到 MS 的问题

进一步简短更新:
我已经找到了一个(坏的和丑陋的)变通方法(将整个代码写到剃须刀控制在一行。 你可以在这里找到详细信息 < a href = “ https://stackoverflow. com/questions/33405283/indination-is-break-in-vision-Studio-cshtml-files/59988164 # 59988164”> 解决错误的缩进剃须刀控件

You might want to try 对 VisualStudio 中新的 Razor 编辑器的改进 - it has greatly improved the formatting quality (still imperfect, though).