首页 > 解决方案 > 为 HtmlHelper 创建一个采用 Action 的扩展方法在 VS 2017 中导致自动格式化问题

问题描述

当前代码

我为此创建了一个扩展方法HtmlHelper,定义如下:

public static IHtmlString MyMethod(this HtmlHelper helper, Action<MyClass> action)
{
    MyClass settings = new MyClass();
    action(settings);
    // Here I can now use the settings as defined in razor view.
}

以这种方式创建扩展方法的目的是让我可以通过允许MyClass在 razor 视图中定义类来调用它,如下所示:

<div>
    @Html.MyMethod(settings =>
    {
        settings.SomeFunction(1, 2, 3);
    })
</div>

问题

现在这很好用,完全符合我的期望。但是,第一个问题是每次我在 Visual Studio 中执行“格式化文档”(Ctrl + E,D)时,第一行之后的所有行都会缩进另一个选项卡。为了清楚起见,在格式化文档 4 次后,它看起来像这样:

<div>
    @Html.MyMethod(settings =>
                    {
                        settings.SomeFunction(1, 2, 3);
                    })
</div>

似乎只有在元素内部使用时才会出现问题(在此示例中div)。但这是我需要能够使用的东西。

从我经常修改的观点来看,很快就可以将它们自动格式化为可见的屏幕空间。然后我需要手动将它们移回。不用说这很烦人,尤其是在一个视图中多次使用时。

我目前正在使用 Visual Studio 2017,我不确定这个问题是否存在于以前的版本中。

我试过的

我尝试了不同的方法来编写代码以试图阻止它,但它总是格式化为相同的问题。例如,我将 移动settings到第二行,将开口移动{到第一行。似乎没有任何效果。几个例子:

@Html.MyMethod(
settings =>
{
    settings.SomeFunction(1, 2, 3);
})

@Html.MyMethod(settings => {
    settings.SomeFunction(1, 2, 3);
})

问题

为什么会发生这种情况,我能做些什么来阻止它?如果这是问题所在,我愿意重新定义扩展方法,只要我可以以与上面显示的相同的方式调用它。


只是一个注释,对于任何使用过 DevExpress MVC 库的人,它允许类似的功能,但不知何故,这似乎并没有受到这个特定问题的影响。我不知道他们做了什么不同,我只知道应该以某种方式实现此功能而不会导致此格式问题。

标签: c#asp.net-mvcrazorvisual-studio-2017html-helper

解决方案


Razor 文件的格式化程序很糟糕。你提到的问题似乎相当温和 - 它可能会变得更糟。这是早于 MVC 的一个长期存在的问题。ASPX 页面的格式化程序同样糟糕。

Razor 文件混合了 5 种语言,每种语言都有不同的格式需求:

  • HTML
  • CSS
  • JavaScript
  • C# 或 Visual Basic
  • 剃刀

也许可以原谅微软在每种情况下都没有正确格式化。实际上我认为他们已经放弃了尝试。

要解决格式问题,我建议在格式不正确后立即按 Control-Z。这将撤消格式化,而不撤消触发它的更改。


推荐阅读