我的当前场景是创建一个网页,允许用户浏览本地文件,将其上传到服务器,并重复此过程,直到他拥有一个要处理的文件列表。当他对文件列表感到满意(它将显示在页面上的网格中)时,他将单击一个按钮来处理这些文件并提取一些数据,这些数据将存储在数据库中。
最后一部分不太重要,现在我正在努力解决一些微不足道的事情,例如建立文件列表并在请求之间保持该列表的持久性。在传统方法中,这非常简单 - 数据将保留在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理解有限,可能有一个非常简单的解决方案。无论如何,如果有人能指点我正��的方向,我将不胜感激。
<form>
中只有一个单独的文件输入字段。因此,在控制器操作中,你只能期望得到这个文件。没有更多了。在ASP.NET MVC中没有ViewState,也没有魔法。 - Darin Dimitrov