无法在 Foreach Request.Files 循环中填充列表?
cant populate a list in a Foreach Request.Files loop?
我在使用遍历 Request.Files 的 foreach 循环将项目添加到列表时遇到问题。它似乎只添加列表中的最后一个对象?即使我的数据库正在保存所有文件的条目,并且个别文件也正在保存。
这是我要发布到的控制器代码(来自 dropzone.js):
public ActionResult SaveDropzoneJsUploadedFiles()
{
List<FileObject> files = new List<FileObject>();
foreach (string fileName in Request.Files)
{
HttpPostedFileBase file = Request.Files[fileName];
// custom file object
var uploadFile = new FileObject();
// files come through, i get the name
uploadFile.Name = file.FileName;
// add to list (only adds last object?)
files.Add(uploadFile);
// files save
file.SaveAs(uploadFile.Path);
// db context saves
db.Files.Add(uploadFile);
db.SaveChanges();
}
}
文件对象class如下:
public class FileObject
{
public string Name { get; set; }
public string Description { get; set; }
public string Path { get; set; }
public string Type { get; set; }
public int Size { get; set; }
public string Hash { get; set; }
}
试试这个
if (Request.Files.Count > 0)
{
for (int i = 0; i < Request.Files.Count; i++)
{
var file = Request.Files[i];
...
}
}
您的 FileObject class 是自定义的 class 吗?如果是这样,您是否覆盖了其中的 GetHashCode 方法?如果是这样,请确保 GetHashCode 方法 returns 每个新实例的唯一值。
更新:
根据您发布的内容,我看不出为什么列表只包含一项。
您是否尝试过调试和单步执行循环并查看列表以确保其内容没有被重置或项目被删除?还要为 files[0] == uploadFile
添加监视并确保该值为 false 或抛出异常(在列表为空的第一遍期间)。
更新 2:
根据作者的新评论,听起来控制器方法被调用了多次。如果是这样,请尝试以下代码更改以证明情况确实如此,但前提是我真的不认为这是一个好主意:
public class DropzoneController
{
private static List<FileObject> files = new List<FileObject>();
public ActionResult SaveDropzoneJsUploadedFiles()
{
foreach (string fileName in Request.Files)
{
HttpPostedFileBase file = Request.Files[fileName];
// custom file object
var uploadFile = new FileObject();
// files come through, i get the name
uploadFile.Name = file.FileName;
// add to list (only adds last object?)
files.Add(uploadFile);
// files save
file.SaveAs(uploadFile.Path);
// db context saves
db.Files.Add(uploadFile);
db.SaveChanges();
}
}
}
如果文件列表开始按预期运行,那么您的文件是通过多次调用传入的。我不认为将这些文件的静态列表挂在身边是个好主意,因为它肯定是代码臭味。
我在使用遍历 Request.Files 的 foreach 循环将项目添加到列表时遇到问题。它似乎只添加列表中的最后一个对象?即使我的数据库正在保存所有文件的条目,并且个别文件也正在保存。
这是我要发布到的控制器代码(来自 dropzone.js):
public ActionResult SaveDropzoneJsUploadedFiles()
{
List<FileObject> files = new List<FileObject>();
foreach (string fileName in Request.Files)
{
HttpPostedFileBase file = Request.Files[fileName];
// custom file object
var uploadFile = new FileObject();
// files come through, i get the name
uploadFile.Name = file.FileName;
// add to list (only adds last object?)
files.Add(uploadFile);
// files save
file.SaveAs(uploadFile.Path);
// db context saves
db.Files.Add(uploadFile);
db.SaveChanges();
}
}
文件对象class如下:
public class FileObject
{
public string Name { get; set; }
public string Description { get; set; }
public string Path { get; set; }
public string Type { get; set; }
public int Size { get; set; }
public string Hash { get; set; }
}
试试这个
if (Request.Files.Count > 0)
{
for (int i = 0; i < Request.Files.Count; i++)
{
var file = Request.Files[i];
...
}
}
您的 FileObject class 是自定义的 class 吗?如果是这样,您是否覆盖了其中的 GetHashCode 方法?如果是这样,请确保 GetHashCode 方法 returns 每个新实例的唯一值。
更新:
根据您发布的内容,我看不出为什么列表只包含一项。
您是否尝试过调试和单步执行循环并查看列表以确保其内容没有被重置或项目被删除?还要为 files[0] == uploadFile
添加监视并确保该值为 false 或抛出异常(在列表为空的第一遍期间)。
更新 2:
根据作者的新评论,听起来控制器方法被调用了多次。如果是这样,请尝试以下代码更改以证明情况确实如此,但前提是我真的不认为这是一个好主意:
public class DropzoneController
{
private static List<FileObject> files = new List<FileObject>();
public ActionResult SaveDropzoneJsUploadedFiles()
{
foreach (string fileName in Request.Files)
{
HttpPostedFileBase file = Request.Files[fileName];
// custom file object
var uploadFile = new FileObject();
// files come through, i get the name
uploadFile.Name = file.FileName;
// add to list (only adds last object?)
files.Add(uploadFile);
// files save
file.SaveAs(uploadFile.Path);
// db context saves
db.Files.Add(uploadFile);
db.SaveChanges();
}
}
}
如果文件列表开始按预期运行,那么您的文件是通过多次调用传入的。我不认为将这些文件的静态列表挂在身边是个好主意,因为它肯定是代码臭味。