Медленная привязка модели MVC при использовании типов datetime, decimal, GUID и Nullable.

В настоящее время я работаю над проблемой производительности в проекте ASP.Net при отправке данных обратно на наш сервер. Набор данных довольно большой и содержит более 1000 элементов, каждый элемент является экземпляром одной и той же модели представления.

Модель представления состоит из более чем 30 свойств (строки, идентификаторы, десятичные числа, даты и время, перечисления и т. д.). Наша проблема заключается в том, что привязка модели занимает слишком много времени, что сильно повлияет на работу пользователя. Мы говорим 8-10 минут на один пост.

Я смотрю запрос в Fiddler, и созданный JSON в порядке, и запрос запускается довольно быстро. При установке точки останова в вызываемом методе контроллера она не срабатывает в течение 8-10 минут.

В рамках моего исследования я урезал модель представления, изменив дату и время на двойные значения, Guid на строки, перечисления на целые числа и десятичные дроби на двойные числа. Это сократило время примерно до 30 секунд, чтобы данные попали в метод контроллера. Я предполагаю, что это как-то связано с тем, что фреймворку приходится упаковывать тысячи свойств в их типы .Net.

Есть ли другой способ решения этой проблемы? изменение типов данных в модели представления, вероятно, вызовет у нас много проблем, а также много дополнительной работы.


person Maple Soup    schedule 01.02.2016    source источник
comment
Ваше редактирование 1000 элементов с 30 свойствами (вы ожидаете, что пользователь отредактирует 30000 элементов управления в форме). Сумасшедший!   -  person    schedule 02.02.2016
comment
Все данные находятся в сетке и содержат множество элементов управления, которые позволяют массово редактировать записи, но не я ожидаю, что пользователи будут делать это. Это требование пользователя! Редко будет 1000 записей, и пользователю на самом деле не нужно редактировать их все, и большинство из них предварительно заполнены значениями по умолчанию, которые ему не нужно будет менять.   -  person Maple Soup    schedule 02.02.2016
comment
Тогда вы не должны размещать их обратно. Используйте модель представления только с теми свойствами, которые вам нужны, и сопоставьте модели представлений с моделями данных.   -  person    schedule 02.02.2016
comment
это не имеет значения, так как 90% полей нужны обратно в контроллере, он все равно будет медленным из-за проблем с десериализацией и привязкой модели в MVC. Если вам нечего добавить, пожалуйста, не отвечайте на вопросы.   -  person Maple Soup    schedule 02.02.2016
comment
как насчет того, чтобы просто опубликовать изменения, а не все строки.   -  person Preet Singh    schedule 02.02.2016


Ответы (1)


Связыватель модели по умолчанию в MVC может быть очень медленным, поскольку ему приходится обрабатывать каждую общую ситуацию связывания модели. Он должен возиться с отражением и другими вещами. Тем не менее, вы бы надеялись, что это будет немного умнее при работе со списками одной и той же модели.

Я подозреваю, что вам, возможно, придется подумать о создании пользовательского связывателя модели для этой ситуации, а не полагаться на значение по умолчанию.

Это будет означать реализацию интерфейса IModelBinder и назначение его в качестве связывателя модели для вашей модели. Хоть что-то исследовать

person Ben Williams    schedule 02.02.2016
comment
Вы могли бы просто пройти в другой конец офиса, чтобы сказать мне это! Все еще не блестящий ответ, учитывая, что 90% информации, которую вы мне предоставили, это то, что я сказал вам 2 дня назад! - person Maple Soup; 03.02.2016