У меня есть модель, подобная следующей:
public class TestViewModel
{
string UpdateProperty { get; set; }
string IgnoreProperty { get; set; }
ComplexType ComplexProperty { get; set; }
}
, где
public class ComplexType
{
long? Code { get; set; }
string Name { get; set; }
}
Мое действие контроллера:
public Edit(int id, FormColleciton formCollection)
{
var model = service.GetModel(id);
TryUpdateModel(model);
//...
}
При вызове действия Edit у меня есть параметр formCollection, содержащий только ключ / значение для UpdateProperty.
После того, как вызов TryUpdateModel UpdateProperty установлен правильно, IgnoreProperty остается без изменений, но для ComplexProperty устанавливается значение NULL, даже если ранее оно имело значение.
Должен ли TryUpdateModel () изменять только свойства, являющиеся частью запроса? Если это не так, каков наилучший способ обойти это, поэтому ComplexProperty изменяется только в том случае, если он включен в запрос?
После того, как Дарин указал, что приведенный выше тестовый пример не продемонстрировал проблему, я добавил сценарий, где эта проблема действительно возникает:
public class TestViewModel
{
public List<SubModel> List { get; set; }
}
public class SubModel
{
public ComplexType ComplexTypeOne { get; set; }
public string StringOne { get; set; }
}
public class ComplexType
{
public long? Code { get; set; }
public string Name { get; set; }
}
Действие контроллера:
public ActionResult Index()
{
var model = new TestViewModel
{
List = new List<SubModel> {
new SubModel{
ComplexTypeOne = new ComplexType{Code = 1, Name = "5"},
StringOne = "String One"
}
}
};
if (TryUpdateModel(model)) { }
return View(model);
}
Отправка запроса:
/Home/Index?List[0].StringOne=test
обновляет свойство SubModel.StringOne, но устанавливает для ComplexTypeOne значение null, даже если оно не включено в запрос.
Является ли это ожидаемым поведением (учитывая, что это не происходит, если не используется перечисление сложных типов)? Как лучше обойти это?