当文件作为数组通过时,Request.Files为空

时间:2019-05-29 15:41:57

标签: c# asp.net-mvc

我正在与第三方表单生成器软件进行一些集成,该软件可将表单发布到我们自己的服务器上。然后将表单数据和文件保存到DB。问题是当表单包含多个文件上载字段时,Request.Files始终为空。

使用Fiddler,我可以看到二进制文件通过。我唯一想到的是字段名称中包含方括号(因为它是作为数组发送的),因此模型绑定程序无法正确绑定它?通过的字段名称为tfa_20[0]tfa_20[1]

在代码方面,这是非常标准的东西:

var data = new Submission()
{
    ConfigurationDetailId = configDetail.Id,
    SubmitterEmail = submitterEmail,
    SubmissionData = Request.Form.AllKeys.Select(k => new SubmissionData()
    {
        FieldName = k,
        FieldValue = Request.Form[k]
    }).ToList(),
    SubmissionFiles = new List<SubmissionFile>()
};

// process any files uploaded
if (Request.Files.Count > 0)
{
    foreach (string field in Request.Files)
    {
        var uploadedFile = Request.Files[field];

        if (!string.IsNullOrEmpty(fileName))
        {
                data.SubmissionFiles.Add(GetSubmissionFile(uploadedFile, fileName));
        }
    }
}

Repository.SaveForm(data);

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

使用HttpPostedFileBase以便将文件发布到您的操作中。如果有多个文件,则应使用HttpPostedFileBase []数组。

要启用表单上载,必须将enctype =“ multipart / form-data”添加到表单标签中。或者,如果您使用剃刀语法,请将beginForm标记更改为此。

View.cshtml

   @using (Html.BeginForm("action","controller", FormMethod.Post, new { @enctype = 
  "multipart/form-data" }))
    {
    }

 public ActionResult YourAction(HttpPostedFileBase[] files)
    {
        var data = new Submission()
        {
            ConfigurationDetailId = configDetail.Id,
            SubmitterEmail = submitterEmail,
            SubmissionData = Request.Form.AllKeys.Select(k => new SubmissionData()
            {
                FieldName = k,
                FieldValue = Request.Form[k]
            }).ToList(),
            SubmissionFiles = new List<SubmissionFile>()
        };

        if (files.Length > 0)
        {
            foreach (HttpPostedFileBase file in files)
            {
                var uploadedFile = file;

                if (!string.IsNullOrEmpty(file.FileName))
                {
                    data.SubmissionFiles.Add(GetSubmissionFile(uploadedFile, file.fileName));
                }
            }
        }

        return View();
    }