【问题标题】:MVC model binding slow when using datetime, decimal, GUID and Nullable types使用 datetime、decimal、GUID 和 Nullable 类型时 MVC 模型绑定缓慢
【发布时间】:2016-02-01 15:59:27
【问题描述】:

我目前正在处理一个 ASP.Net 项目中的性能问题,将数据发回我们的服务器时。数据集相当大,包含 1000 多个项目,每个项目都是同一视图模型的一个实例。

视图模型包含 30 多个属性(字符串、guid、小数、日期时间、枚举等)。我们遇到的问题是模型绑定需要花费大量时间,这将极大地影响用户体验。我们谈论一个帖子 8-10 分钟。

我正在 Fiddler 中查看请求,生成的 JSON 很好,请求很快就启动了。在被调用的控制器方法中放置断点时,它不会在 8-10 分钟内被命中。

作为我调查的一部分,我剥离了视图模型,将日期时间更改为双精度值,将 Guid 更改为字符串,将枚举更改为整数,将小数更改为双精度值。这将数据到达控制器方法的时间缩短到了大约 30 秒。我猜这与框架必须将数千个属性打包到它们的 .Net 类型中有关。

还有其他方法可以解决这个问题吗?更改视图模型中的数据类型可能会给我们带来很多问题以及很多额外的工作。

【问题讨论】:

  • 您正在编辑具有 30 个属性的 1000 个项目(您希望用户在一个表单中编辑 30000 个控件)。疯了!
  • 数据都在一个网格中,并包含许多允许批量编辑条目的控件,但不是我希望用户这样做。这是用户要求!很少有 1000 个条目,用户实际上不必编辑所有条目,并且大多数都预先填充了不需要更改的默认值
  • 那么您不应该将它们发回。使用仅包含所需属性的视图模型并将视图模型映射回数据模型
  • 这并没有什么不同,因为控制器中需要返回 90% 的字段,但由于 MVC 中的反序列化和模型绑定问题,它仍然会很慢。如果您没有任何有用的内容要添加,请不要回复问题。
  • 只发回更改而不是所有行怎么样。

标签: c# asp.net-mvc asp.net-mvc-4 model-binding boxing


【解决方案1】:

MVC 中的默认模型绑定器可能非常慢,因为它必须处理所有通用模型绑定情况。它必须与反射和其他一些东西混在一起。也就是说,在处理相同模型的列表时,您会希望它更聪明一些。

我怀疑您可能不得不考虑为这种情况创建自定义模型绑定器,而不是依赖默认值。

这意味着实现 IModelBinder 接口并将其指定为模型的模型绑定器。至少要调查一些事情

【讨论】:

  • 你可以走到办公室的另一边告诉我这个!看到你提供给我的 90% 的信息,这仍然不是一个绝妙的答案,这是我 2 天前告诉你的!!
猜你喜欢
  • 2021-05-20
  • 1970-01-01
  • 2011-08-16
  • 1970-01-01
  • 1970-01-01
  • 2011-08-18
  • 1970-01-01
  • 2015-02-01
相关资源
最近更新 更多