使用HttpPostedFileBase的ICollection上传多个文件?

时间:2017-10-10 15:31:43

标签: c# asp.net-mvc asp.net-mvc-4

我正在尝试上传多个文件并执行此操作我正在使用ICollection<HttpPostedFileBase>。我选择使用ICollection代替IEnumerable,因为使用ICollection我可以使用函数Count来检查ICollection的大小。它运行得很好,问题是当我尝试检查大小时它总是有一个值,即使它是空的,即使我没有选择任何文件它有一个值,我不知道它为什么会发生。

为什么ICollection总是有一个值,即使我不选择文件?我怎么能解决这个问题?

型号

public ICollection<HttpPostedFileBase> imagens  { get; set; }

HTML

<div class="form-group">
                <label for="@Html.IdFor(model => model.imagens)" class="col-md-12 control-label">Imagens (Max.10) </label>
                <div class="col-md-10">
                    @Html.TextBoxFor(model => model.imagens, new{
                                                                Class = "form-control",
                                                                placeholder = "Escolha as imagens",
                                                                multiple = "multiple",
                                                                type = "file"
                                                                })
                    @Html.ValidationMessageFor(model => model.imagens)
                </div>
            </div>

控制器

//check if ICollection is empty. It still doesn't works. 
if (model.imagens.Count == 0){
                jsonResposta.Add("status", "0");
                jsonResposta.Add("msg", "Add at least one picture");
                return Json(jsonResposta);
            }   

1 个答案:

答案 0 :(得分:1)

这与您的集合类型(ICollection)无关。浏览器(chrome是我检查过的)总是发送application/octet-stream类型的表单数据项,即使您没有选择任何文件。这适用于单个文件选择器和多个文件选择器。我相信正是模型绑定器正在为单个文件正确处理它,但是当你的属性类型是HttpPostedFileBase集合时,它没有正确处理它。

现在,您最好的解决方案就是过滤掉自己。

[HttpPost]
public ActionResult Index(YourViewModel model)
{
    var validFiles = model.imagens.Where(g=>g!=null).ToList();
    //use validFiles  from now onwards
   // to do : Return something
}