我在使用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();
}
}
答案 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];
...
}
}