ASP.NET MVC 5 HttpPostedFileBase在模型中始终为null

时间:2018-08-08 12:46:32

标签: asp.net-mvc asp.net-mvc-5

我正在尝试将一些带有额外字段的文件发送到服务器。

这是我的模特

// PreOrderInput contains some fields that getting populated correctly
public class PreOrderInputModel : PreOrderInput
{
    public new List<FileInputModel> Files { get; set; }
}

public class FileInputModel
{
    public HttpPostedFileBase FileContent { get; set; }
    public string FileName { get; set; }
    public DocumentTypeCodes DocumentTypeCode { get; set; }
}

这是vue.js应用程序中准备表单数据的部分

getFormData()
{
    var data = new FormData()

    data.append("LegalData[ProfileTypeCode]", this.model.type)
    data.append("LegalData[Inn]", this.model.inn)
    data.append("LegalData[OrganisationName]", this.model.organization)
    data.append("LegalData[Email]", this.model.email)
    data.append("Files[0][FileName]", this.model.files.passport.name)
    data.append("Files[0][FileContent]", this.model.files.passport.file)
    data.append("Files[0][DocumentTypeCode]", this.documentTypeCode.SNILS)

    return data
},

该应用发布以下数据(示例)

mimeType: multipart/form-data; boundary=----WebKitFormBoundaryUTk0Jj2CJJCLZOYm

------WebKitFormBoundaryUTk0Jj2CJJCLZOYm
Content-Disposition: form-data; name="LegalData[ProfileTypeCode]"

null
------WebKitFormBoundaryUTk0Jj2CJJCLZOYm
Content-Disposition: form-data; name="LegalData[Inn]"

null
------WebKitFormBoundaryUTk0Jj2CJJCLZOYm
Content-Disposition: form-data; name="LegalData[OrganisationName]"

null
------WebKitFormBoundaryUTk0Jj2CJJCLZOYm
Content-Disposition: form-data; name="LegalData[Email]"

null
------WebKitFormBoundaryUTk0Jj2CJJCLZOYm
Content-Disposition: form-data; name="Files[0][FileName]"

AdmittedSkzi.xlsx
------WebKitFormBoundaryUTk0Jj2CJJCLZOYm
Content-Disposition: form-data; name="Files[0][FileContent]"; filename="AdmittedSkzi.xlsx"
Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet


------WebKitFormBoundaryUTk0Jj2CJJCLZOYm
Content-Disposition: form-data; name="Files[0][DocumentTypeCode]"

11
------WebKitFormBoundaryUTk0Jj2CJJCLZOYm--

这是控制者

[HttpPost]
public ActionResult CreatePreOrder(PreOrderInputModel preOrderInput)
{
    preOrderInput.CreatorLogin = UserLogin;
    return Json(_customerPreOrderService.CreatePreOrder(UserLogin, preOrderInput));
}

尽管Request.Files包含发布的文件数据,但preOrderInput.Files [0] .FileContent为null。

我错过了重要的东西吗?

1 个答案:

答案 0 :(得分:1)

您要将与模型无关的属性名称附加到FormData

您已经注意到自己,您使用preOrderInput.Files[0].FileContent来访问控制器方法中的值-即点符号来访问复杂对象的属性,因此FormData中的属性名称必须与之匹配符号。

由于preOrderInput是方法中参数的名称,因此只需将其从属性名称中删除即可,因此应该是

var data = new FormData()
....
data.append("Files[0].FileContent", this.model.files.passport.file); // not "Files[0][FileContent]"

并为您添加将添加到FormData

的其他属性名称