作为一个经验丰富的ASP.Net开发商,我最近才开始使用MVC, 我发现自己在努力改变我的思维方式, 从传统的“服务器控制和事件处理者”做事方式, 变成更动态的MVC方式。我想我正在慢慢到达那里,但有时MVC的“魔术”把我甩掉了。
我目前的设想是创建一个网页,让用户浏览本地文件,上传到服务器上,并在有要处理的文件列表之前重复这个网页。 当他满意文件列表( 将在页面的网格中显示) 时, 他将单击一个按钮来处理文件, 并提取一些存储在数据库中的数据 。
最后一个部分并不那么重要,而现在我正在忙着解决一些无关紧要的事情,比如建立一份文件清单,并且坚持在请求之间排出这份清单。 在传统的做法中,这将是非常简单的 — — 数据将持续在View State。 但在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 动作中设置一个断点时, 导入 Data 参数是空的。 因此, 视图显然没有将其模型的当前实例传到动作中 。
在我所经历的MVC样本中, 模型实例被“神奇地”传递到动作方法上, 作为一种参数, 那么为什么它现在是空的呢?
我认为真正的问题是我对MVC的有限理解,而且可能有一个非常简单的解决方案。 总之,如果有人能指示我正确的方向,我将非常感激。