1

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; }
     }
4

2 に答える 2

4

モデルをコントローラーと密接に接続させていると思います。これを行う通常の方法は次のとおりです。

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

HttpPostedFileBaseこの場合、厳密には ASP.NET の概念である をモデルが認識する必要はありません。

提供されているものを超えた複雑なバインドが必要な場合DefaultModelBinder(これはかなりの量です)、通常の方法は、特殊化された ModelBinders を登録してからGlobal.asax、次のように独自のモデル クラスをアクション メソッドの引数として受け入れることです。

Global.asax

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

この ModelBinder は、たとえば、フォームに投稿されたファイルを見つけて、そのファイルの内容を .xml のDataプロパティにバインドできますThing

そしてあなたのコントローラーで:

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

このアクション メソッドでは、ThingModelBinderすべてのバインディングを処理し、コントローラーとモデルの両方に対して透過的にします。

この場合、ASP.NET を認識して機能するように実際のモデル クラスを変更する必要はありません。結局のところ、Model クラスは実際のデータを表すことになっています。

于 2010-04-08T16:07:23.807 に答える
0

どうやら、MVC Futures 2には、特にモデルバインダーに関して、大きな変更があります(わかったばかりです)。

たとえば、入力ファイルがバイト配列にバインドされている問題、現在バインダーがあります。

•BinaryDataModelBinderProvider–base-64でエンコードされたbyte[]およびSystem.Linq.Data.Binaryモデルへのバインドを処理します。

于 2010-04-08T20:37:33.943 に答える