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

时间:2011-08-01 17:39:02

标签: asp.net-mvc visual-studio visual-studio-2010 asp.net-mvc-3 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块的主体是缩进的,除了看起来更好。

11 个答案:

答案 0 :(得分:42)

务必将编辑器设置为使用空格字符而不是制表符。当使用标签时,编辑器似乎完全失去了理智。这是一个遗憾,因为所有这些空格字符最终都在实际的HTML输出中,大大增加了数据传输的大小。 我所做的是在输入时手动补充自动格式。不太理想,但希望微软能够为下一个服务包找到它。

答案 1 :(得分:12)

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

例如,替换以下内容:

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

使用:

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

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

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

答案 2 :(得分:8)

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

答案 3 :(得分:5)

此处更好的替代方法(而不是使用制表符空格)是将HTML和C#/ VB的块缩进更改为“阻止”而不是“智能”。这不是一个完整的解决方案,但IMO比使用空间更难以解决问题!

答案 4 :(得分:4)

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

答案 5 :(得分:3)

在我的情况下,它是resharper覆盖格式化选项。

如果您使用重塑器并遇到此问题,请尝试此操作...

Resharper&gt;&gt;选项&gt;&gt;剃刀&gt;&gt;编辑&amp;格式化&gt;&gt;取消“输入时自动格式化”

答案 6 :(得分: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>

答案 7 :(得分:0)

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

<强> BEFORE

**BEFORE**

<强> AFTER

enter image description here

答案 8 :(得分:0)

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

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

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

答案 9 :(得分:0)

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

答案 10 :(得分:-2)

我建议您通过注释粘贴的代码片段来阻止自动格式化。通过这种方式,粘贴时不会破坏。