2009-11-15 3 views
0

Это в основном теоретический вопрос, так как я действительно могу его реализовать каким-либо образом, но это меня немного смущает. Итак, предположим, что я представляю пользователю страницу со списком файла 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/файла, что-то вроде этого.

ответ

2

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

+0

Согласен, я сохраняю данные в db и показываю итоговый экран с записями и ошибками. с другим экраном, который извлекает имя и позволяет пользователю выбрать его для дальнейшей обработки, сохранить внутренние данные в db. – Decker97

+0

Нажатие, возможно, мегабайта данных на страницу - это действительно плохая идея. И тогда пользователь просто закрывает браузер (или он падает) - будут ли данные оставаться в БД навсегда? Да, есть способы отслеживать это - я делаю это сам - но есть ли какой-либо общий способ или библиотека, чтобы тысяча программистов не изобретала это каждый день? – queen3

0

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

// 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, что я когда-то упал потому что я не читал документацию тщательно.В нем говорится, что метод начнет бросать исключения, если в папке temp содержится более 65535 файлов. Поэтому не забудьте всегда удалять временный файл после завершения его обработки.

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

+0

См. Обновление. Что касается файлов, как я уже сказал, речь идет о разборе данных, так что на самом деле должны храниться структуры данных - это IList . Но это не имеет большого значения. – queen3

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