作为一个经验丰富的 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 页面的视图以及包含文件列表的 viewmodel 实例。
这在一定程度上工作得很好,我可以浏览文件并上传它,我可以看到动作中的视图模型数据,然后如果我在视图中放置一个断点并调试“this.Model”,一切都是美好的。
但是,如果我尝试上传另一个文件,在 AddImportFile 操作中放置断点时,importData 参数为空。所以视图显然没有将其模型的当前实例传递给动作。
在我经历过的MVC示例中,模型实例被“神奇”地作为参数传递给了action方法,那为什么现在是空的呢?
我认为真正的问题是我对 MVC 的理解有限,并且可能有一个非常简单的解决方案。无论如何,如果有人能指出我正确的方向,我将非常感激。