Мне понравилась идея использования интерфейсов для разделения того, какие свойства должны быть включены при обновлении объекта.
Например:
Чтобы создать и обновить объект person:
interface ICreatePerson
{
string Name { get; set; }
string Sex { get; set; }
int Age { get; set; }
}
interface IUpdatePerson
{
string Name { get; set; }
}
class Person : ICreatePerson, IUpdatePerson
{
public int Id { get; }
public string Name { get; set; }
public string Sex { get; set; }
public int Age { get; set; }
}
Затем при привязке модели просто используйте соответствующий интерфейс в качестве типа, и он только обновит свойство name.
Вот пример метода контроллера:
public ActionResult Edit(int id, FormCollection collection)
{
// Get orig person from db
var person = this.personService.Get(id);
try
{
// Update person from web form
UpdateModel<IUpdatePerson>(person);
// Save person to db
this.personService.Update(person);
return RedirectToAction("Index");
}
catch
{
ModelState.AddModelErrors((person.GetRuleViolations());
return View(person);
}
}
См. эту статью (и комментарии) для очень хорошего обсуждения вариантов.