2009-03-21 15 views
1

フィールドの型がbyte []であるフィールドがあります。このフィールドは、エンティティのRecordVersionプロパティ(データベースのタイムスタンプ)を保持します。エンティティを保存するときにこのフィールドを使用できるようにするにはどうすればよいですか?私は2つの異なるものを試してみたし、これまでのところ成功していないASP.NET MVC:フィールドバイトを保持する方法

: これはレンダリング「System.Byte []」:

これは、タイプは変換できませんでしたModelStateErrorをスロー
<%= Html.Hidden("RecordVersion", Model.RecordVersion.ToString()) %> 

:私は上のタイムスタンプを入れていないだろう

答えて

2

モデルバインダーを作成して登録する必要があります。

このarticleは、あなたがやっていることと非常によく似た隠しフィールドでlinqデータベースのタイムスタンプを使用する方法を示しています。

ModelBinders.Binders.Add(typeof(Binary), new LinqBinaryModelBinder()); 

global.asaxで登録してください。

LinqBinaryModelBinderは先物アセンブリにあります。ユーザーバイト[]を使用する場合は、自分で書き込む必要があります。

+0

おそらく最も安全なことは、byte []をbase64-stringとして表すことでしょう。 –

+0

ModelBinders.Binders.Add(typeof(Binary)、新しいLinqBinaryModelBinder())でうまく動作します。 ありがとうございます。 –

0

/アンバインドバインドはずっとバイト[]フィールドを好きではないんどうやらデフォルトMVCのメカニズム

ViewData["RecordVersion"] = entity.RecordVersion 

..... 形。私はそれをサーバー側にキャッシュし、IDを使用してキャッシュから取得するオブジェクトを保持したい場合。それ以外の場合は、データベースからオブジェクトを再取得し、フォームデータから変更を適用することができます。後者は、私がTryUpdateModelを使って行うことです。

public ActionResult Update(int id) 
{ 
    using (var context = new DataContext()) 
    { 
     var model = context.Models.Where(m => m.ID == id).Single(); 
     if (TryUpdateModel(model)) 
     { 
      ... 
      context.SubmitChanges(); // wrapped in try/catch 
      ... 
     } 
     else 
     { 
      ... 
     } 
    } 
    return RedirectToAction("Show", new { id = id }); 
} 
+0

@ tvanfosson - これは良い方法であり、明らかに、あなたの変更を再生する最も一般的な方法です。私は自分のオブジェクトのIDとRecordVersionを自分のフォームに保持して、私自身のフレームワークを使って変更を返すことができるようにしようとしています(すなわち、エンティティを再クエリする必要はありません...) –

1

試しましたか?

<%= Html.Hidden("RecordVersion", System.Text.Encoding.Unicode.GetString(Model.RecordVersion)) %> 
+0

レンダリングしたようです形式の文字列ですが、途中ではまだバイト[]に変換されません.... –

+0

Encoding.Unicode.GetBytesを使用してバイト配列に戻すことができる場所をmodelbinderできます。 – KaraT

関連する問題