Это в основном теоретический вопрос, поскольку я действительно могу реализовать его любым способом, но это меня немного смущает. Итак, предположим, я предоставляю пользователю страницу для выбора файла Excel, который затем загружается на сервер. Серверный код анализирует файл и предоставляет пользователю другую страницу с множеством параметров. Пользователь может выбрать и отменить выбор некоторых из них, отредактировать имена, а затем нажать кнопку «ОК», после чего сервер должен обработать только выбранные параметры.
Вопрос может быть:
- лучше хранить проанализированный файл в сеансе?
- лучше ли переместить проанализированные данные на страницу клиента и затем получить их обратно?
Вот пример:
public class Data
{
public string Name { get; set; } // shown to user, can be changed
public bool Selected { get; set; } // this is in ViewModel but anyway
public string[] InternalData { get; set; } // not shown to user
}
// 1st option is to receive data via POST
public ActionResult ImportConfirmed(IList<Data> postitems)
{
// 2nd option is to receive only user changes via POST
var items = Session["items"] as IList<Data>;
items = items.Where(postitems of same name selected);
items.ForEach(set name to postitems name);
}
Очевидно, что вариант № 2 имеет меньше побочных эффектов, поскольку не имеет глобального состояния. Но в варианте № 1 мы не передаем множество бесполезных для пользователя данных клиенту. И это может быть много.
Конечно, эта проблема не нова, и, как всегда, ответ: это зависит.
Должен признать, у меня нет точного вопроса. Я даже не могу сказать, почему мне не нравится решение Session, которое занимает всего пару дополнительных строк кода. Причина, по которой я спрашиваю, состоит в том, что я прочитал о концепции Weblocks и был очень впечатлен. Итак, я попытался изобрести нечто подобное в ASP.NET MVC и не смог. Таким образом, мне интересно, есть ли какой-нибудь элегантный способ справиться с такими ситуациями? Под элегантным я подразумеваю что-то, что не показывает, что он использует Сеанс, прост в использовании, обрабатывает истечения (очищает Сессию, если пользователь не нажимает последнюю кнопку «Сохранить») и т. Д. Что-то вроде:
var data = parse(filestream);
var confirmationPostData = ShowView("Confirm", data);
items = items.Where(confirmationPostData of same name selected);
items.ForEach(set name to confirmationPostData name);
Здесь ShowView фактически отправляет GET, ожидает POST пользователя и возвращает. Вид. Я не настаиваю, я просто показываю, как это меня впечатлило (в Weblocks - если я действительно все правильно понял).
Все ли просто используют сессию в таких случаях? Или есть лучший способ (кроме изучения LISP, который я уже начал исследовать, если смогу справиться)? Может быть, асинхронные действия в MVC v2 делают это?
ОБНОВЛЕНИЕ: сохранение в файлах DB / temp, работает. Я иногда храню в БД. Однако для этого нужен способ истечения срока действия данных, поскольку пользователь может просто отказаться от него (так же просто, как закрыть браузер). Я спрашиваю: есть ли проверенный и элегантный способ решения проблемы, а не о том, как это сделать. Абстракция, построенная поверх сериализации, не привязанная к конкретной реализации БД / файла, что-то вроде этого.