c# - 为 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 库的人,它允许类似的功能,但不知何故,这似乎并没有受到这个特定问题的影响。我不知道他们做了什么不同,我只知道应该以某种方式实现此功能而不会导致此格式问题。
解决方案
Razor 文件的格式化程序很糟糕。你提到的问题似乎相当温和 - 它可能会变得更糟。这是早于 MVC 的一个长期存在的问题。ASPX 页面的格式化程序同样糟糕。
Razor 文件混合了 5 种语言,每种语言都有不同的格式需求:
- HTML
- CSS
- JavaScript
- C# 或 Visual Basic
- 剃刀
也许可以原谅微软在每种情况下都没有正确格式化。实际上我认为他们已经放弃了尝试。
要解决格式问题,我建议在格式不正确后立即按 Control-Z。这将撤消格式化,而不撤消触发它的更改。
推荐阅读
- mysql - SpringBoot JPA MySQL 列名
- node.js - 如何在命令中使用 client.on('quildMemberAdd') 事件?
- arrays - 在 SwiftUI 中的 forEach 期间将文本字段输入添加到数组
- python - Keras - 训练效果很好,预测都是 NaN(边界损失)
- java - 如何处理乱七八糟的异步操作?
- java - 一种在堆栈中的某个位置插入元素的方法。(爪哇)
- training-data - 从每个边界框中提取
- javascript - 如何让状态更新
- javascript - 安全输入字段以仅允许使用键盘
- mongodb - 如何在 Docker 中将 Debezium 连接到 MongoDB?