首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么ASP.NET MVC默认模型绑定器运行缓慢?它需要很长时间才能完成它的工作

为什么ASP.NET MVC默认模型绑定器运行缓慢?它需要很长时间才能完成它的工作
EN

Stack Overflow用户
提问于 2013-02-19 23:36:59
回答 3查看 5.5K关注 0票数 19

在当前的项目中,客户要求以两种方式回答问卷的可能性:在单一形式中使用Wizard (一次一个问题)和Listing (一次所有问题)。这两种方法都已经实现了。

根据手册的章节,问题是使用AJAX从数据库中加载的(这非常快)。目前最大的章节是230问题(每个问题都有4个HTML输入字段-输入/文本,选择等)。如果用户选择以Listing格式回答此类章节,则<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> questions的数据。AnswerViewModel只有4个字段来存储每个答案。

问题是,在单击Save按钮之后需要相当长的时间(准确地说是10秒)来命中此操作方法上的断点,也就是说,这10秒大概是在模型绑定器中花费的。

值得一提的是,在实现HTTP POST中的ViewModel集合属性时,我使用Steve Sanderson的@Html.BeginCollectionItem helper来提供帮助。查看数据是如何进入ViewModel (键)的:

你知道我可以尝试做些什么来优化它吗?

我想了4个变通办法:

  1. 仅存回已修改的问题。为此,我需要在加载清单时将每个回答值存储在一个数据属性中,并将其与提交数据时的实际值进行比较,因为这个人建议在客户端使用here.
  2. Create AnswerViewModel JavaScript对象,并将它们传递给操作方法。这会减轻模型活页夹的压力吗?
  3. 滚动我自己的模型活页夹...但我真的不知道它是否会比ASP.NET MVC附带的默认版本更快。根据我所读到的内容,默认的模型绑定器做了很多反射来设置值/合成动作的模型参数,这可以是bottleneck.
  4. Use FormCollection并枚举发布的数据,通过键获取每个值并手动执行验证,如here.

所示

你还有什么建议吗?

更新1

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

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

现在,只需要2 seconds就可以完成10 seconds所需的功能。

  • 看起来像是对performance.

有很大影响的默认模型绑定器验证检查ModelState

更新2

我刚刚又经历了一次:使用List<Guid>作为操作参数,并且只通过$.getJson调用传递59 strings,大约需要3秒才能命中操作方法第一行中的断点。将参数类型更改为List<string>可以使整个操作在一眨眼的时间内完成。

一个有趣的事实是,在action方法中,我这样做了:

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

并且它即时地将资源List<string>转换为List<Guid>

可以肯定的是,ASP.NET模型绑定器有一些缺陷。我只想知道那是什么..。:)

EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14961290

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档