Как довольно опытный разработчик ASP.Net, который недавно начал использовать MVC, я немного пытаюсь изменить свое мышление с помощью традиционного метода "управления сервером и обработчиком событий", в более динамичный способ MVC, Я думаю, что я медленно добираюсь туда, но иногда MVC "магия" отбрасывает меня.
Мой текущий сценарий - создать веб-страницу, которая позволяет пользователю просматривать локальный файл, загружать его на сервер и повторять это, пока у него не будет списка файлов для работы. Когда он доволен списком файлов (который будет отображаться в сетке на странице), он нажмет кнопку, чтобы обработать файлы и извлечь некоторые данные, которые будут храниться в базе данных.
Последняя часть не так важна, сейчас я борюсь с чем-то таким же тривиальным, как создание списка файлов и сохранение этого списка между запросами. В традиционном подходе это было бы чрезвычайно просто - данные сохранялись бы в ViewState. Но в MVC мне нужно передать данные между контроллером и представлениями, и я не полностью понимаю, как это должно работать.
Думаю, я лучше опубликую свою довольно неполную попытку кодирования этого, чтобы объяснить проблему.
Чтобы сохранить данные списка файлов, я создал модель представления, которая представляет собой типизированный список файлов, а также некоторые дополнительные метаданные:
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 и что, вероятно, это очень простое решение. В любом случае, я был бы чрезвычайно благодарен, если бы кто-нибудь мог указать мне в правильном направлении.