【问题标题】:cant populate a list in a Foreach Request.Files loop?无法在 Foreach Request.Files 循环中填充列表?
【发布时间】:2015-07-31 05:18:57
【问题描述】:

我在使用 foreach 循环遍历 Request.Files 时将项目添加到列表时遇到问题。似乎只添加列表中的最后一个对象?即使我的数据库正在保存所有文件的条目,并且各个文件也正在保存。

这是我发布到的控制器代码(来自 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 循环之外初始化“httpPostedFilebase”
  • 请发布 FileObject 类的定义,特别是如果您要覆盖 GetHashCode 方法。

标签: c# asp.net-mvc dropzone.js


【解决方案1】:

您的 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();
        }
    }

}

如果文件列表开始按预期运行,则说明您的文件是通过多次调用传入的。我认为保留这些文件的静态列表并不是一个好主意,因为它肯定是代码很臭。

【讨论】:

  • 我已经发布了文件对象类 - 没有覆盖 GetHashCode,干杯
  • 在 VS2015 中仔细查看它我认为这是因为文件正在被传入并且它正在运行多线程......我似乎无法解决如何在任何线程中处理这个问题安全收藏
  • 哇,等一下。 SaveDropzoneJsUploadedFiles 是否被外部呼叫者多次呼叫?如果是这样,那么这就是列表只包含一项的原因。
  • @jessemillman 我已经更新了我的答案,并尝试了另一件事。它不是线程安全的,但如果需要,您可以将List&lt;FileObject&gt; 替换为线程安全的替代方案。另外,我不认为像这样不受管理的静电是一个好主意,所以要小心。
【解决方案2】:

试试这个

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

【讨论】:

  • 谢谢,但不幸的是我得到了相同的结果 - 只有 1 个文件被添加到列表中。
  • 我已经添加了文件对象类:)
  • 你可以试试这个files.Add(new FileObject(){Name = file.FileName})
  • 嗨 Narek - 我也试过了,不幸的是结果相同
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-09-09
  • 1970-01-01
  • 2022-11-11
  • 2016-02-23
  • 2016-11-25
  • 2017-11-17
  • 1970-01-01
相关资源
最近更新 更多