2009-06-09 2 views
1

Рассмотрим следующий код:ASP.NET MVC: Как слишком сохранить Orignal состояние объекта по проводам

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) %> /> 

и sumbmit к:

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(); 
} 

ответ

3

сделать некоторые расширения пользовательских HtmlHelper методы, которые просто выписывают как скрытый, так и текстовый элемент. Таким образом, ваша разметка просмотров остается простой, но вы по-прежнему получаете отслеживание состояния pre/post в своей информации о сообщении.

Я бы отклониться от варианта сериализации: -/

+0

На самом деле стандартный HtmlHelper уже имеет Html.Hidden и Html.TextBox. Но может быть, вы имеете в виду некоторых помощников для создания списка хидденов, использующих отражение? – alex2k8

+0

Я на самом деле хочу сделать новый метод расширения, который сидит вдоль стороны Html.Hidden и Html.TextBox, который просто объединяет эти методы, чтобы упростить факт, что вам нужно сделать скрытое текстовое поле для каждого свойства, которое вы хотите отобразить. Таким образом, ваш взгляд показывает только что-то вроде: «Html.EditField» , который отобразит как скрытое, так и текстовое поле в html –

+0

А .. Хорошая идея! – alex2k8

1

Пока я не знаю, как решить вашу проблему, я могу вам сказать, что вы думаете было бы крайне опасно. На самом деле ничто не мешало клиенту изменять данные, отправленные по запросу, и в лучшем случае имели недопустимые данные, введенные в вашу базу данных. Вы не должны доверять клиенту скрытые поля, запросы или файлы cookie, содержащие данные, которые вы должны вставить (если вы не подписываете данные, отправленные клиенту в первую очередь, а затем проверяйте подпись).

+0

Я собираюсь разрешить пользователю отправлять любые значения, которые ему нравятся, поэтому идея не защищена от взломов, просто чтобы исключить дополнительные запросы к БД. – alex2k8

+0

Кроме того, вы можете зашифровать значение скрытого поля. Тогда это так же безопасно, как, например, файл cookie ASPXAUTH – chris166

Смежные вопросы