Рассмотрим следующий код:
public ActionResult Edit(int id)
{
return View(db.Foos.Single(x => x.Id == id));
}
Когда пользователь отправляет изменения, я хотел бы получить как исходные, так и текущие значения объекта, так что код обновления может быть:
Foo foo = db.Foos.Attach(current, original);
db.SubmitChanges();
Я вижу два варианта:
1) Отобразить несколько скрытых входных данных, содержащих исходные значения
<input type="hidden" name="original.A" value="<%= Model.A %> />
<input type="hidden" name="original.B" value="<%= Model.B %> />
<input type="text" name="current.A" value="<%= Model.A %>
<input type="text" name="current.B" value="<%= Model.B %>
и отправьте по адресу:
public ActionResult Update(Foo current, Foo original)
{
Foo foo = db.Foos.Attach(current, original);
db.SubmitChanges();
}
2) Использовать некоторую сериализацию / десериализацию в одном скрытом поле
<input type="hidden" name="original" value="<%= Serialize(original) %> />
и добавить к:
public ActionResult Update(Foo current, string original)
{
Foo original = DeserializeFrom<Foo>(original);
Foo foo = db.Foos.Attach(current, original);
db.SubmitChanges();
}
Есть ли другие варианты? Или инструменты, которые облегчают написание такого кода?
EDIT:
Чтобы быть более ясным ... идея сохранения исходного значения состоит в том, чтобы исключить дополнительный выбор, который происходит, если код написан следующим образом:
public ActionResult Update(Foo changed)
{
Foo original = db.Foos.Single(x => x.Id == changed.Id);
MyUtils.CopyProps(original, current);
db.SubmitChanges();
}