为什么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议你通过评论你粘贴的那段代码来防止自动格式化。 这样,事情就不会被打破。