代码之家  ›  专栏  ›  技术社区  ›  Leff

ASP.NET MVC 5 httpPostedFileBase在模型中始终为空

  •  1
  • Leff  · 技术社区  · 8 年前

    我正在尝试向服务器发送几个有额外字段的文件。

    这是我的模型

    // 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为空。

    我错过重要的东西了吗?

    1 回复  |  直到 8 年前
        1
  •  1
  •   user3559349    8 年前

    您正在将属性名附加到 FormData 这和你的模型不相关。

    正如你所指出的,你使用 preOrderInput.Files[0].FileContent 访问Controller方法中的值-即访问复杂对象的属性的点表示法,因此 表单数据 必须与那个符号匹配。

    自从 preOrderInput 是方法中参数的名称,您只需从属性名称中删除该名称,因此它应该是

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

    和其他属性名一样 表单数据