Visual Studio 的 .cshtml 文件中缩进出现问题。

21

这是最令人恼火的事情,经过45分钟的谷歌搜索和测试后,我向论坛之神屈服了...我简直无法在 .cshtml 视图文件上没有自动缩进。

我正在使用VS2015社区版。 我的 cshtml 文件一直表现良好,直到现在...

由于某种奇怪的原因,缩进出了问题。

我已经尝试了显而易见的方法:

  • 选择标记并按 Ctrl+K 和 Ctrl+F
  • 删除并重新添加结束标记(通常会重置缩进)
  • 进入 工具 > 选项 > 文本编辑器 > [插入语言或全部] > 制表符,并将它们设置为智能。

在注意到问题之前,我刚刚安装了 ReSharper。不确定是否引起了问题,但问题确实是新的,我不记得以前看到过它。

另外奇怪的是,有些内容会缩进,而有些则不会。

需要可视化帮助的人,请看这个让我沮丧的缩进:

@{
    Layout = null;
}

<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width"/>
    <title>Index</title>
</head>
<body>
<h1>Posts Index</h1>
@if (true)
{
 <text>
     <p>True is true!</p>
 </text>
}
</body>
</html>

你有没有看过 Resharper > Options > Code Editing > HTML|Razor|etc > Formatting Style 这个选项?我发现默认设置似乎无法与 VS 自动格式化很好地配合,需要进行一些配置。也许在重新安装 Resharper 时你可能丢失了一些设置。 - learningcs
你把 {<text> 写在同一行是不行的。因为你混合了 C# 和 Html 在同一行。请将 <text> 放在花括号/大括号/小括号下面的新一行,然后尝试按下 CTRL+K、CTRL+F(或者CTRL+K、CTRL+D……或其他自动格式化热键)。 - Bardicer
@rshepp: 就是这样!它有一个“不缩进子标签”的条款,其中包括一堆常见的标签...我猜不是每个人都认为上面的缩进是“错误的”,而是会选择保留它。然而我喜欢好的缩进。谢谢!将其发布为答案,我会将其标记为这样的。 - Methodician
@Nick 嗯...不确定为什么它在我复制的代码中会出现这种情况,但在我的实际代码中它是独立的一行。我会更新帖子以匹配... - Methodician
3个回答

18

您提到在问题出现之前刚刚安装了Resharper,因此您的问题很可能是由于Resharper引起的。

默认情况下,Resharper会在您输入时执行许多额外的格式修正,但您可能会发现许多这些默认修正与您的编码风格冲突。

您可以通过Resharper > 选项 > 代码编辑 > HTML|Razor|等等 > 格式化样式配置Resharper的代码格式选项。

在这种情况下,您的问题是设置不缩进子元素所包含的标记不是您想要的默认设置。


再次感谢rshepp,这就是我想要的!到目前为止,我非常喜欢ReSharper。 - Methodician
非常感谢!优秀的回答,真的很感激你提供的线索。 - RJB

3

自我更新到Visual Studio 2015 SP2后(在VS 2013之后),已经过去了三周,我遇到了一个问题,即在cshtml文件中复制/粘贴和注释会破坏我的文件格式。有趣的是,制表符缩进位于第7列。我不明白为什么会这样。

更新到VS 2015 SP3后,该问题并未被解决。

然后我发现,在我的cshtml文件中,“@”符号破坏了我的复制/粘贴/注释:

@model MAWGridModel<AktionGridRowModel>

@if (Model != null)
{
    @Html.DevExpress().GridView(settings =>
    {
        settings.Name = "MAWAktionenErgebnisGrid";
    ...
    }).Bind(Model).GetHtml();
}

"Html.DevExpress()..."之前的"@"符号会造成问题。这是我用过的代码片段(希望它真的能解决问题)。

@model MAWGridModel<AktionGridRowModel>

@if (Model != null)
{
    Html.DevExpress().GridView(settings =>
    {
        settings.Name = "MAWAktionenErgebnisGrid";
        // ...
    }).Bind(Model).Render();
}

希望这对您有所帮助。


1
我遇到了类似的问题,但在我的情况下,是一个 @* ... *@ 注释块位于已经开始的 @-代码块内。我用传统的 // 替换了 @* ... 注释符号,然后一切都恢复正常对齐了。 - Reuel Ribeiro

0

我使用VS2017(asp.net core 2.2),使用Devextreme控件,遇到了完全相同的问题。
我已经长时间停用了自动复制粘贴后的自动格式化功能(因为它不起作用)。
由于我的视图中有大量的DE控件(每个控件平均有5个属性),我不得不时不时地对视图进行格式化(使用“格式化文档”,而“格式化选择”在我的安装中不起作用),以使文件结构“可读”。

如果我这样做,我就会遇到完全相同的问题(行向右缩进直到它们不可见为止,即使我有一个大屏幕...)。
为了使文件再次“可读”,我必须手动编辑每一行(删除错误的空格)。

我已经浪费了数小时的时间来尝试和错误地解决问题。 我找到的唯一(非常丑陋和糟糕的)“解决方法”是将整个代码写在一行上。
例如:@(Html.DevExtreme().TextBox().ID("AngebotFirma").Value(@Model.PAB_Firma).MaxLength(45).Placeholder("Firma...").InputAttr("autocomplete", "company") )

这样,整个文档(包括HTML、JQuery和Devextreme)都会被正确格式化。

所以...这不是一个解决方案,但可能是为了节省时间而采用的一种变通方法。我将把代码更改为“单行代码”,至少在完成和测试视图之前。 之后,我也许会将代码改回“多行”...


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