ASP.Net MVC и состояние — как сохранить состояние между запросами

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

51
задан tereško 21 June 2012 в 05:29
поделиться