为什么Visual Studio代码格式化不能正确使用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块的主体是缩进的,除了看起来更好。

确保将编辑器设置为使用空格字符而不是制表符。 当编辑使用时,编辑似乎完全失去了主意。 这是一个耻辱,因为所有这些空格字符在实际的HTML输出结束,大大增加了数据传输的大小。 我所做的是手动补充自动格式化,我键入。 不理想,但希望微软将这个想法下一个服务包。

我find了一个“解决scheme”,允许您继续使用制表符缩进和正确的格式。 这更多的是一种模式。 关键是使用razor代码块,而不是内联代码。

因此,例如,replace以下内容:

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

有:

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

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

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

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

这里更好的select(而不是使用空格作为制表符)是将HTML和C#/ VB的块缩进更改为“Block”而不是“Smart”。 这不是一个完整的解决scheme,但海事组织是一个比使用空间less得多的痛苦工作!

我知道这不是你正在寻找的答案,但我已经使用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> 

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

如果你使用reshaper,并得到这个问题试试这个…

resharper >>选项>>razor>>编辑与格式>>不需要input“自动格式化”

我find了另一个解决scheme。 只需select文件中的所有代码,单击Shift +选项卡以删除代码之前的所有选项卡,然后复制并粘贴它。 Visual Studio自动格式化代码。 在VS 2013 .cshtml文件上工作

现在我在VS2013 ASP.NET MVC 5,我仍然有这个问题。 我发现很有帮助的是将第一个expression式放在开头块符号是( @{ )的同一行上。 这样的剃刀代码格式产生了更好的结果。 这里是前后的情况:

之前

**之前**

在这里输入图像说明

我build议你通过评论你粘贴的那段代码来防止自动格式化。 这样,事情就不会被打破。