Редактирование большого импортированного файла на второй странице - PullRequest
0 голосов
/ 15 ноября 2009

Это в основном теоретический вопрос, поскольку я действительно могу реализовать его любым способом, но это меня немного смущает. Итак, предположим, я предоставляю пользователю страницу для выбора файла 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, работает. Я иногда храню в БД. Однако для этого нужен способ истечения срока действия данных, поскольку пользователь может просто отказаться от него (так же просто, как закрыть браузер). Я спрашиваю: есть ли проверенный и элегантный способ решения проблемы, а не о том, как это сделать. Абстракция, построенная поверх сериализации, не привязанная к конкретной реализации БД / файла, что-то вроде этого.

Ответы [ 2 ]

2 голосов
/ 15 ноября 2009

Я не уверен, какова цель загрузки файла Excel, но мне нравится, чтобы все действия, влияющие на долгосрочное состояние приложения, для пользователя, сохранялись. Например, что, если пользователь загружает файл, изменяет пару параметров, а затем переходит на обед. Если вы храните информацию в сеансе, она может исчезнуть, когда они вернутся, то же самое для хранения ее на странице со скрытыми переменными. Как насчет хранения его в БД?

0 голосов
/ 15 ноября 2009

Я бы сохранил файл во временной папке и связал бы только имя файла с сеансом пользователя, чтобы потом его можно было обработать:

// Create a temp file in the Temp folder and return its name:
var tempFile = Path.GetTempFileName();
// write to the temp file and put the filename into the session
// so that the next request can fetch the file and process it

Есть ошибка с GetTempFileName , в которую я однажды попал, потому что я не внимательно прочитал документацию. Он говорит, что метод начнет генерировать исключения, если у вас есть более 65535 файлов во временной папке. Поэтому не забывайте всегда удалять временный файл после его обработки.

Другой альтернативой временной папке может быть сохранение файла в базе данных, но я немного скептически отношусь к хранению файлов в реляционной базе данных.

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