ASP.NET MVC: как сохранить оригинальное состояние объекта по проводам - PullRequest
1 голос
/ 09 июня 2009

Рассмотрим следующий код:

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

Ответы [ 2 ]

3 голосов
/ 09 июня 2009

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

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

1 голос
/ 09 июня 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...