我有一个webapi项目,并不能找出一个很好的方式来绑定上传的文件内容。asp.net 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 */
}
这显然不工作,虽然模型本身是空的,我不明白为什么。我期待它会绑定属性并忽略文件。
版本2:
public IHttpActionResult Post(Person entity, HttpPostedFileBase somefile) {
/* some code */
}
还与不同的名称试图在形式输入在客户端(文件,文件上传,文件,HttpPostedFile,HttpPostedFileBase)
版本3:
public IHttpActionResult Post(HttpPostedFileBase somefile) {
/* some code */
}
somefile在这里也是空的。
版本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 */
}
定制绑定从来没有所谓。
我可以从上下文请求的形式访问这些文件,但该模型相当复杂,这将意味着我必须结合其属性自己。如果框架中已经有一个,我不想编写一个联编程序。 有没有办法解决这个问题?
你是否在相同的请求正文中发布文件和模型? –
你可以绑定模型,然后从请求中读取文件信息到它吗? –