Это в основном теоретический вопрос, так как я действительно могу его реализовать каким-либо образом, но это меня немного смущает. Итак, предположим, что я представляю пользователю страницу со списком файла 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, которое принимает только пару дополнительных строк кода. Причина, по которой я спрашиваю, это то, что я читал о концепции и был очень впечатлен. Итак, я попытался придумать что-то подобное в ASP.NET MVC и не смог. Таким образом, интересно, есть ли элегантный способ справиться с такими ситуациями? Изящный я имею в виду то, что не показывает она использует Session, простой в использовании, обрабатывает истечение срока (очищает сеанс, если пользователь не нажмет окончательную кнопка «Сохранить») и т.д. Что-то вроде:
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-файлах, это работает. Я иногда храню в БД. Однако для этого требуется истечение срока действия данных, поскольку пользователь может просто отказаться от него (так же просто, как закрыть браузер). То, что я прошу: есть ли проверенный и изящный способ его решения - не о том, как это сделать. Абстракция, построенная поверх сериализации, не привязана к конкретной реализации DB/файла, что-то вроде этого.
Согласен, я сохраняю данные в db и показываю итоговый экран с записями и ошибками. с другим экраном, который извлекает имя и позволяет пользователю выбрать его для дальнейшей обработки, сохранить внутренние данные в db. – Decker97
Нажатие, возможно, мегабайта данных на страницу - это действительно плохая идея. И тогда пользователь просто закрывает браузер (или он падает) - будут ли данные оставаться в БД навсегда? Да, есть способы отслеживать это - я делаю это сам - но есть ли какой-либо общий способ или библиотека, чтобы тысяча программистов не изобретала это каждый день? – queen3