不能在Foreach请求中填充列表.文件循环

本文关键字:列表 文件 循环 填充 Foreach 请求 不能 | 更新日期: 2023-09-27 18:05:37

我有问题添加项目的列表与foreach循环通过Request.Files迭代。它似乎只添加列表中的最后一个对象?即使我的数据库保存了所有文件的条目,并且单个文件也被保存。

这是我发布到的控制器代码(from 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();
    }
}

fileObject类如下:

    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; }
    }

不能在Foreach请求中填充列表.文件循环

您的FileObject类是自定义类吗?如果是,您是否重写其中的GetHashCode方法?如果是,确保GetHashCode方法为每个新实例返回一个唯一的值。

:

根据你发布的内容,我不明白为什么这个列表只包含一个项目。

你有没有试过调试和逐步通过循环和观察列表,以确保它的内容没有被重置或项目被删除?还要为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();
        }
    }
}

如果文件列表开始像预期的那样运行,那么您的文件将通过多个调用进入。我不认为这是一个好主意,有这些文件的静态列表挂在周围,虽然它肯定是代码臭。

试试这个

if (Request.Files.Count > 0)
{
    for (int i = 0; i < Request.Files.Count; i++)
    {
        var file = Request.Files[i];
        ...
    }
}