Как довольно опытный разработчик 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>
Представление использует модель представления в качестве своей модели:
@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 вместе с экземпляром модели представления, содержащим список файлов.
Это прекрасно работает до определенного момента, я могу просматривать файл и загружать его, и я могу видеть данные модели представления внутри действия, а затем также, если я ставлю точку останова внутри представления и отлаживаю "this.Model" , Все отлично.
Но затем, если я попытаюсь загрузить другой файл, при установке точки останова внутри действия AddImportFile параметр importData будет пустым. Таким образом, представление явно не передает текущий экземпляр своей модели в действие.
В образцах MVC, с которыми я работал, экземпляр модели «волшебным образом» передается методу действия в качестве параметра, так почему же он сейчас пуст?
Я предполагаю, что реальная проблема заключается в моем ограниченном понимании MVC, и что, вероятно, существует очень простое решение этой проблемы. В любом случае, я был бы очень признателен, если бы кто-нибудь мог указать мне правильное направление.