【问题标题】:Why doesn't Visual Studio code formatting work properly for Razor markup?为什么 Visual Studio 代码格式不适用于 Razor 标记?
【发布时间】:2011-10-17 15:34:08
【问题描述】:

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

【问题讨论】:

  • 4 年了,这仍然是个问题... :o
  • 现在 6 年了,在 VS2017 中仍然是一个问题......
  • 现在快 8 年了,在 VS2019 中仍然是一个问题......
  • 现在已经快 10 年了,这仍然是一个问题。 .Net 5,(核心的未来)(VS2019)

标签: asp.net-mvc visual-studio visual-studio-2010 asp.net-mvc-3 razor


【解决方案1】:

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

【讨论】:

  • 我想要完全不格式化我的 HTML/Razor 的选项。它似乎从来没有正常工作,有时它会以破坏页面的方式重新格式化我的 HTML(有时添加空格会破坏布局 - grr)。我想如果可以解决所有的错误并生成干净的 html/razor 我会很高兴,但我的猜测是这太复杂了,总会有错误。此外,最好为 Razor 和 C# 使用不同的格式。我通常将大括号放在 C# 中的单独一行,但在 Razor 中放在同一行。
  • 一年多过去了,我仍然每天都为这些错误感到沮丧。 VS 2010 有什么安排,还是重点放在 VS 2012 上?
  • @Stijn 最近发布了新版本的 MVC(包括新的 Razor 工具) (asp.net/mvc)。但是,您必须升级您的项目才能使用 MVC 4。我们目前没有任何计划在 MVC 3 中为 Razor 提供编辑器错误修复。
  • @marcind 我正在查看 Visual Studio 2012 中的 MVC 4 项目,如果您使用制表符而不是空格,它仍然无法正常工作(ifs 中的左括号和右括号获取空格而不是制表符) .
  • 现在在 VS2015 更新 2 中变得更糟了。如果关闭所有格式选项并粘贴代码或键入新功能块,所有代码都会左对齐。让我疯狂。 “什么都不做”有什么难的?
【解决方案2】:

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

【讨论】:

  • 非常烦人 - 我讨厌使用空格进行缩进。不过,它确实有效,所以谢谢你的建议。
  • 空格与制表符的争论几乎不是一个封闭的争论。这是一个偏好问题。我更喜欢标签,但不是因为文件大小。两种偏好都有参数,例如,lea.verou.me/2012/01/why-tabs-are-clearly-superior
  • 它最终以 HTML 输出形式结束的事实实际上并没有增加太多的数据传输大小。如今,大多数 Web 服务器和浏览器都使用压缩,因此重复的空格并不会真正增加那么多。
  • 仍然是 Visual Studio 2015 中的一个错误 :(((
  • greatly increasing the data transfer size 你关闭了服务器压缩?否则这是非常名义上的......
【解决方案3】:

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

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

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

与:

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

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

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

【讨论】:

  • 我在为 DevExpress 网格编写很长的流利方法调用链时发现自己。
  • +10000 为此。很棒的建议,效果很好。 @{ if(something) { // regular c# comments too... } }
  • 理论上好主意,但不幸的是在 VS2017 中对我不起作用
  • 也适用于 VS 2019。
  • 天啊...这种解决方法非常值得一游堆栈溢出...谢谢分享:)
【解决方案4】:

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

【讨论】:

  • 这是否为您提供了完美的格式?或者它只是更近了一步,就像我上面的解决方案一样?至少我会试一试! :)
  • 你摇滚。这似乎有所帮助。
  • 不错,简单的解决方案。出于某种原因,我的设置为“无”,因此更改为“智能”实际上对我有用。至少这个答案告诉我去哪里看!
【解决方案5】:

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

【讨论】:

  • 在 VS2013 中不可能 - 在 cshtml 文件中无法禁用粘贴格式 - 尝试了一切... :o(
【解决方案6】:

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

【讨论】:

    【解决方案7】:

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

    之前

    之后

    【讨论】:

      【解决方案8】:

      在我的例子中,它是 reshaper 覆盖格式选项。

      如果您使用 reshaper 并遇到此问题,请尝试以下操作...

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

      【讨论】:

        【解决方案9】:

        我为此找到了另一种解决方案。只需选择文件中的所有代码,单击 Shift + tab 删除代码之前的所有选项卡,复制并粘贴它。 Visual Studio 自动格式化代码。处理 VS 2013 .cshtml 文件

        【讨论】:

        • 我试试,但文字会小写
        【解决方案10】:

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

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

        该问题似乎在 Visual Studio 2019 版本 16.0 Preview 2.1 中部分解决
        Link to MS for the issue

        进一步的简短更新:
        我找到了一种(糟糕且丑陋的)解决方法(将整个代码写入 ONE 行中的剃须刀控件。 你可以在这里找到详细信息Workaround to wrong indentation Razor Controls

        【讨论】:

        • 微软要么撒谎,要么无能。这在 VS2019 v16.7.5 中仍然是一个问题。来源:我,现在。
        • 感谢您的更新 - (坏消息,但很高兴知道)
        【解决方案11】:

        您可能想尝试Improvements to the new Razor editor in Visual Studio - 它极大地提高了格式化质量(尽管仍然不完美)。

        【讨论】:

          猜你喜欢
          • 2014-11-13
          • 2013-12-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多