Я думаю, что это было бы хорошо, если бы Вы прокомментировали его, например, // ^ == XOR
.
ОБНОВЛЕНИЕ:
Я прошел через исходный код mvc (в частности, класс DefaultModelBinder
) и вот что я обнаружил:
Класс определяет, что мы пытаемся привязать коллекцию, поэтому он вызывает метод: UpdateCollection (.. .)
, который создает внутренний ModelBindingContext
, имеющий свойство null
Model
. После этого этот контекст отправляется методу BindComplexModel (...)
, который проверяет свойство Model
на null
и создает новый экземпляр типа модели, если это так.
Это то, что вызывает сброс значений.
Итак, заполняются только значения, поступающие через форму / строку запроса / данные маршрута, остальные остаются в своем инициализированном состоянии.
Вы только что дали мне идею покопаться в исходном коде ASP.NET MVC 2. Я борюсь с этим уже две недели . Я обнаружил, что ваше решение не будет работать с вложенными списками. Я помещаю точку останова в метод UpdateCollection, и она никогда не срабатывает. Похоже, что корневой уровень модели должен быть списком для вызова этого метода
Это вкратце модель, которая у меня есть ... У меня также есть еще один уровень общих списков, но это всего лишь небольшой пример.
public class Borrowers
{
public string FirstName{get;set;}
public string LastName{get;set;}
public List<Address> Addresses{get;set;}
}
Думаю, мне нужно будет копнуть глубже, чтобы узнать, что происходит.
ОБНОВЛЕНИЕ: UpdateCollection по-прежнему вызывается в asp.net mvc 2, но проблема с вышеуказанным исправлением связана с этим ЗДЕСЬ
Руди Бриденраед только что написал отличное сообщение , описывающее эту проблему и очень полезное решение. Он переопределяет DefaultModelBinder, а затем, когда он встречает коллекцию для обновления, он фактически обновляет элемент, а не создает его новым, как поведение MVC по умолчанию. При этом поведение UpdateModel () и TryUpdateModel () согласуется как с корневой моделью, так и с любыми коллекциями.