Как довольно опытный разработчик ASP.Net, который недавно начал использовать MVC, я немного пытаюсь изменить свое мышление с помощью традиционного «управления сервером и обработчиком событий», способ делать вещи, в более динамичный способ MVC. Я думаю, что я медленно добираюсь туда, но иногда MVC «волшебство» отбрасывает меня.ASP.Net MVC и состояние - как сохранить состояние между запросами
Мой текущий сценарий - создать веб-страницу, которая позволяет пользователю просматривать локальный файл, загружать его на сервер и повторять это, пока у него нет списка файлов для работы. Когда он доволен списком файлов (который будет отображаться в сетке на странице), он нажмет кнопку, чтобы обработать файлы и извлечь некоторые данные, которые будут храниться в базе данных.
Последняя часть не так важна, прямо сейчас я борюсь с чем-то таким же тривиальным, как создание списка файлов и сохранение этого списка между запросами. В традиционном подходе это было бы чрезвычайно просто - данные сохранялись бы в ViewState. Но в MVC мне нужно передать данные между контроллером и представлениями, и я не полностью понимаю, как это должно работать.
Думаю, я лучше опубликую мою довольно неполную попытку кодирования этого, чтобы объяснить проблему.
Для того, чтобы сохранить мой список файлов данных, я создал ViewModel, который является в основном список типизированных файлов, наряду с некоторыми дополнительными метаданными:
public class ImportDataViewModel
{
public ImportDataViewModel()
{
Files = new List<ImportDataFile>();
}
public List<ImportDataFile> Files { get; set; }
...
В представлении, у меня есть форма для просмотра и загрузки файла:
<form action="AddImportFile" method="post" enctype="multipart/form-data">
<label for="file">
Filename:</label>
<input type="file" name="file" id="file" />
<input type="submit" />
</form>
вид использует ViewModel в качестве своей модели:
@model MHP.ViewModels.ImportDataViewModel
Это будет отправить файл на мое действие:
public ActionResult AddImportFile(HttpPostedFileBase file, ImportDataViewModel importData)
{
if (file.ContentLength > 0)
{
ImportDataFile idFile = new ImportDataFile { File = file };
importData.Files.Add(idFile);
}
return View("DataImport", importData);
}
Это действие возвращает представление для страницы DataImport вместе с ViewModel, например, содержащим список файлов.
Это хорошо работает до определенного момента, я могу просматривать файл и загружать его, и я могу видеть данные в виде viewmodel внутри действия, а затем также, если поставить точку останова внутри представления и отладить «this.Model ", Все отлично.
Но если я попытаюсь загрузить другой файл, при установке точки останова внутри действия AddImportFile параметр importData пуст. Таким образом, представление, очевидно, не передает текущий экземпляр своей модели для действия.
В образцах MVC, с которыми я прошел, экземпляр модели «магически» передается методу действия в качестве параметра, поэтому почему он пуст сейчас?
Я предполагаю, что реальная проблема заключается в моем ограниченном понимании MVC и что, вероятно, это очень простое решение. В любом случае, я был бы чрезвычайно благодарен, если бы кто-нибудь мог указать мне в правильном направлении.
Вы не храните загруженные файлы в любом месте сервера. Как вы ожидаете, что они будут сохраняться между обратными передачами? Все, что у вас есть в вашем '
Дарин, спасибо за ваш комментарий. Верно, что я не храню файл на сервере. Я мог бы хранить его в базе данных, но это было бы пустой тратой пространства базы данных и терпения пользователя, поскольку это займет много времени, и в этом нет никакой реальной необходимости. То, что я хотел бы сделать, это просто сохранить его в памяти сервера как переменную так или иначе, пока пользователь не решит ее обработать. Затем я буду хранить вывод этой обработки в базу данных. Я думаю, что либо пытаюсь использовать MVC неправильно, либо просто не знаю, как это сделать. Я просто не знаю, какой из них еще ... – TMan
Хранение файлов в серверной памяти - одна из худших вещей. Избегайте этого по любой цене. Мало того, что это потребует много памяти на вашем сервере, но не забывайте, что IIS может в любой момент переработать домен приложения, потеряв все данные, хранящиеся в памяти. И что, если вы запускаете серверную ферму?Если вы храните в памяти сервера, это означает, что только 1 сервер фермы имеет эту информацию, и если балансировщик нагрузки отправляет последующие запросы на другой сервер фермы, вы потеряете эту информацию. –