asp.net webapi绑定ef模型与文件

时间:2017-03-19 11:36:27

标签: c# asp.net entity-framework asp.net-web-api

我有一个webapi项目,无法想出一种绑定上传文件内容的好方法。

我有一个实体框架模型如下:

public class Person
{
    public int Id { get; set; }
    public string Name { get; set; }
    public UploadedFileId UploadedFileId { get; set; }
    public virtual UploadedFile UploadedFile { get; set; }
}

上传的文件如下:

public class UploadedFile
{
    public int Id { get; set; }
    public byte[] Content { get; set; }
    public string FileName { get; set; }
}

我在客户端上有一个SPA,上传文件的表格,     

在控制器中我试着让模型绑定与文件上传一起工作,但我的尝试都没有。

版本1:

using System.Web.Http;

...

public IHttpActionResult Post(Person entity) {
    /* some code */
}

这显然不起作用,虽然模型本身是null,我不明白为什么。我原以为它会绑定属性而忽略文件。

第2版:

public IHttpActionResult Post(Person entity, HttpPostedFileBase somefile) {
    /* some code */
}

在客户端输入的表单中也尝试使用不同的名称(文件,fileUpload,文件,HttpPostedFile,HttpPostedFileBase)

第3版:

public IHttpActionResult Post(HttpPostedFileBase somefile) {
    /* some code */
}

somefile在这里也是null。

第4版:试图创建一个绑定

public class UploadedFilesModelBinder : IModelBinder
{
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        HttpPostedFileBase file =controllerContext.HttpContext.Request.Files[bindingContext.ModelName];
        var uploadFile = new UploadedFile();
        uploadFile.FileName = file.FileName;
        uploadFile.Content = new byte[(int)file.InputStream.Length];
        file.InputStream.Read(uploadFile.Content, 0, (int)file.InputStream.Length);

        return uploadFile;
   }
}

Global.asax中

ModelBinders.Binders[typeof(UploadedFile)] = new UploadedFilesModelBinder();

控制器

public IHttpActionResult Post(UploadedFile somefile) {
    /* some code */
}

自定义活页夹从未调用。

我可以从上下文请求表单中访问文件,但模型非常复杂,这意味着我必须自己绑定它的属性。如果框架中已有一个绑定器,我不想写一个绑定器。 有没有办法解决这个问题?

1 个答案:

答案 0 :(得分:0)

看一下这个答案Open Weather API。同样基于https://stackoverflow.com/a/19746825/2138959,您可以阅读多部分表单数据。第一部分将代表模型,您可以使用媒体类型格式化程序映射到模型,以避免手动属性映射,然后使用文件读取第二部分并手动将文件设置为模型。