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

模型绑定httppostedfilebase,然后将文件存储到数据存储

  •  1
  • mare  · 技术社区  · 14 年前

    ASP.NET MVC似乎可以正确地在HTML表单的文件输入字段和httpPostedFileBase之间进行绑定。另一方面,它无法从文件输入字段绑定到字节数组。.我尝试了,但它发出了异常——无法转换为base64。以前我的模型类上只有字节数组属性,因为稍后我需要它将对象序列化为XML文件。

    现在我想出了这个解决方法,它工作得很好,但我不确定这是否可以:

      [DataContract]
         public class Section : BaseContentObject
         {
    
           ...
          [DataMember]
          public byte[] ImageBytes;
    
          private HttpPostedFileBase _imageFile;
          public HttpPostedFileBase ImageFile
          {
           get { return _imageFile; }
           set
           {
            _imageFile = value;
            if (value.ContentLength > 0)
            {
             byte[] buffer = new byte[value.ContentLength];
             value.InputStream.Read(buffer, 0, value.ContentLength);
             ImageBytes = buffer;
             ImageType = value.ContentType;
            }
           }
          }
    
          [DataMember]
          public string ImageType { get; set; }
         }
    
    2 回复  |  直到 14 年前
        1
  •  4
  •   bzlm    14 年前

    我想你是让你的模型和你的控制器紧密相连。通常的方法是:

    public ActionResult AcceptFile(HttpPostedFileBase submittedFile) {
      var bytes = submittedFile.FileContents;
      var model = new DatabaseThing { data = bytes };
      model.SaveToDatabase();
    }
    

    在这种情况下,您的模型不需要知道 HttpPostedFileBase 这是一个严格的ASP.NET概念。

    如果你需要复杂的绑定超过 DefaultModelBinder 供应品(这是很多),通常的方法是在 Global.asax 然后接受您自己的模型类作为操作方法参数,如下所示:

    全球.asax :

    ModelBinders.Binders.Add(typeof(MyThing), new ThingModelBinder()); 
    

    例如,这个modelbinder可以找到任何与表单一起发布的文件,并将该文件的内容绑定到 Data 您的财产 Thing .

    在控制器中:

    public ActionResult AcceptThing(MyThing thing) {
      thing.Data.SaveToDatabase();
    }
    

    在这个动作方法中, ThingModelBinder 将处理所有绑定,使其对控制器和模型都透明。

    在这种情况下,不需要修改实际的模型类来了解ASP.NET,也不需要使用它来执行函数。毕竟,您的模型类应该表示您的实际数据。

        2
  •  0
  •   mare    14 年前

    显然,MVC Futures2发生了巨大的变化(刚刚发现),特别是在模型绑定方面。

    例如,我的输入文件绑定到字节数组时出现问题,现在有一个绑定器:

    _、BinaryDataModelBinderProvider_“处理绑定base-64编码输入到byte[]和system.linq.data.binary模型。