无法在Foreach Request.Files循环中填充列表?

时间:2015-07-31 05:18:58

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

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

这里是我发布的控制器代码(来自dropzone.js):

<?php
$args = array(
    'posts_per_page' => -1,
    'post_type' => 'testimonials', // This is the CPT's slug!
    'tax_query' => array(
        array(
            'taxonomy' => 'testimonial-category', // This is the taxonomy's slug!
            'field' => 'slug',
            'terms' => array('testimonial-home') // This is the term's slug!
        )
    ),
    'order' => 'ASC',
    'orderby' => 'menu_order'
  );
$my_query = new WP_Query( $args );

if($my_query->have_posts()): 
  while($my_query->have_posts()): $my_query->the_post(); ?>
      <li>
        <h3><?php the_title(); ?></h3>
        <?php if($thumbnail): ?>
          <img src="<?php echo $thumbnail[url]; ?>" />
        <?php endif; ?>
        <p><?php the_content(); ?></p>
      </li>
  <?php endwhile; // End while $my_query->have_posts
endif; // End if $my_query->have_posts

wp_reset_postdata(); ?>

fileObject类如下:

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

2 个答案:

答案 0 :(得分: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();
        }
    }

}

如果文件列表开始按预期运行,那么您的文件将通过多个调用进入。我不认为让这些文件的静态列表徘徊是个好主意,因为它肯定是代码很臭。

答案 1 :(得分:0)

试试这个

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