asp.net-mvc – 为什么ASP.NET MVC默认的模型绑定器很慢?做好工作需要很长时间

前端之家收集整理的这篇文章主要介绍了asp.net-mvc – 为什么ASP.NET MVC默认的模型绑定器很慢?做好工作需要很长时间前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
在当前的项目中,客户要求以两种方式回答问卷的可能性:使用向导(一次一个问题)和列表(所有问题一次)以单一形式。两种方式都已经实现。

使用AJAX(这是超级快速),手册章节从数据库中加载了这些问题。目前最大的一章有230个问题(每个都有4个HTML输入字段 – 输入/文本,选择等)。如果用户选择这样的章节以列表格式回答,< form>将包含约920个字段以发布到服务器。

我正在做一个AJAX POST请求,通过jQuery的serialize方法传递数据:

data: $("#questions :input").serialize()

此序列化需要207.143ms才能完成。我在Firefox中使用Firebug调试此值:

console.profile();
$("#questions :input").serialize();
console.profileEnd();

再次这是超快的…

当使用以下操作方法对接收到的数据进行保湿时,会出现问题:

public async Task<ActionResult> ListSaveAsync(IEnumerable<Answerviewmodel> questions)

如您所见,发布的数据是绑定到IEnumerable< Answerviewmodel>的数据。的问题。 Answerviewmodel只有4个字段来存储每个答案。

事情是,在点击“保存”按钮以在此操作方法上点击一个断点之后,需要相当长的时间(正好是10秒),也就是说,大概在模型绑定中花了10秒钟。

一件重要的事情是,我使用史蒂夫·桑德森的@Html.BeginCollectionItem helper来帮助从HTTP POST实现viewmodel集合属性。查看数据在viewmodel(Keys)中如何获取

你知道我可以尝试做哪些优化?

我想到了4个解决方法

>仅保存修改后的问题。为此,我需要在加载列表时将每个答案值存储在数据属性中,并将其与实际值进行比较,当提交< form>正如这个人建议here
>在客户端创建Answerviewmodel JavaScript对象,并将它们传递给action方法。这会减轻模型粘合剂吗?
>滚动我自己的模型绑定器…但我真的不知道它是否会比ASP.NET MVC附带的默认值更快。从我读过的默认模型绑定器做了很多反思来设置值/水合物的动作模型参数,这可能是瓶颈。
>使用FormCollection并枚举通过按键获取每个值的已发布数据,并手动执行验证,如here所示。

你还建议什么?

更新1

我选择了3,并实现了一个自定义的模型绑定器:AnswerModelBinder:IModelBinder并使用它在具体的操作方法

public async Task<ActionResult> ListSaveAsync(
             [ModelBinder(typeof(AnswerModelBinder))]List<Answerviewmodel> questions)

现在需要10秒才能完成只需2秒钟。

>看起来像默认模型绑定器验证检查[ModelState]对性能有很大的影响。

更新2

我刚刚经历过一次:有一个List< Guid>作为一个动作参数,通过一个$ .getJson调用只传递59个字符串需要〜3秒钟来触发动作方法第一行的断点。将参数类型更改为List< string>使整个事情都在眨眼间工作。

一个有趣的事实是,在动作方法中我做到了这一点:

List<Guid> userIds = resources.Select(Guid.Parse).ToList();

并转换资源列表< string>列表< Guid>瞬间。

肯定有一些bug与ASP.NET模型绑定。我只想知道是什么… 原文链接:https://www.f2er.com/aspnet/252239.html

猜你在找的asp.Net相关文章