1

バージョン管理されたモデルがあります:

public class VersionedModel
{
    public Binary Version { get; set; }
}

を使用してレンダリング

<%= Html.Hidden("Version") %>

それは与えます:

<input id="Version" name="Version" type="hidden" value="&quot;AQID&quot;" />

それは少し奇妙に見えます。いずれにせよ、フォームが送信されると、Version フィールドは常に null になります。

public ActionResult VersionedUpdate(VersionedModel data)
{ 
    ...
}

バージョンをネットワーク経由で渡すにはどうすればよいですか?

編集:

素朴な解決策は次のとおりです。

public ActionResult VersionedUpdate(VersionedModel data)
{ 
    data.Version = GetBinaryValue("Version");
}

private Binary GetBinaryValue(string name)
{
    return new Binary(Convert.FromBase64String(this.Request[name].Replace("\"", "")));
}
4

6 に答える 6

2

見つけた関連記事。

1) http://geekswithblogs.net/frankw/archive/2008/08/29/serialization-issue-with-timestamp-in-linq-to-sql.aspx

「バイナリ バージョン」を「byte[] バージョン」に変えることを提案していますが、一部のコメント投稿者は次のことに気付きました。

このアプローチの問題は、切断されたデータ コンテキストを使用している場合など、Table.Attach(modified, original) オーバーロードを使用する場合に機能しないことです。

2) http://geekswithblogs.net/AndrewSiemer/archive/2008/02/11/converting-a-system.data.linq.binary-or-timestamp-to-a-string-and-back.aspx

私の「素朴な解決策」に似た解決策を提案します

public static string TimestampToString(this System.Data.Linq.Binary binary) 
{ ... }

public static System.Data.Linq.Binary StringToTimestamp(this string s)
{ ... }

3) http://msdn.microsoft.com/en-us/library/system.data.linq.binary.aspx

ASP.Net を使用していて、並行性のために SQL Server の "timestamp" データ型を使用している場合は、"timestamp" の値を文字列に変換して、(Web ページなどに) 格納できるようにすることをお勧めします。LINQ to SQL が SQL Server から "タイムスタンプ" を取得すると、バイナリ クラス インスタンスに格納されます。したがって、基本的に Binary インスタンスを文字列に変換してから、文字列を同等の Binary インスタンスに変換できるようにする必要があります。

以下のコードは、これを行うための 2 つの拡張メソッドを提供します。通常の静的メソッドにしたい場合は、最初のパラメーターの前にある「this」を削除できます。Base 64 への変換は、結果の文字列に表示可能な文字のみが含まれ、エスケープ文字が含まれないようにするための予防措置です。

public static string ConvertRowVersionToString(this Binary rowVersion) {
  return Convert.ToBase64String(rowVersion.ToArray());
}
public static Binary ConvertStringToRowVersion(this string rowVersion) {
  return new Binary(Convert.FromBase64String(rowVersion));
}
于 2009-06-14T17:43:51.067 に答える
1

フォーム送信時にバインドされたモデルでそれが表示されない問題は、データを文字列からバイナリ表現に再構築するためにモデル バイナリで使用できる Convert.ToBinary() メソッドがないことだと思います。これをやりたい場合は、値を手で変換する必要があると思います。表示されている値は、バイナリ値の Base64 エンコーディング (Binary.ToString() の出力) であると推測します。その場合は、Base64 からバイト配列に変換し直し、それを Binary() コンストラクターに渡して値を再構成する必要があります。

代わりに、サーバー側でオブジェクトをキャッシュすることを考えましたか? これは、データ コンテキストからオブジェクトをデタッチする必要があるだけでなく (LINQ を想定しています)、オブジェクトを別のデータ コンテキストに再アタッチすることができないため、少し注意が必要です。このブログ エントリは、そのルートに進むことにした場合に役立つ場合があります。

于 2009-06-14T12:37:59.070 に答える
0

ここのようにたくさんの方法があります

byte[] b = BitConverter.GetBytes(DateTime.Now.Ticks);//新しいバイト [(DateTime.Now).Ticks]; _store.Version = 新しい System.Data.Linq.Binary(b)

(あなたのバージョンをバインドして除外していることを確認してください)、

しかし、最善の方法は、DBに処理させることです...

于 2010-04-19T11:41:37.227 に答える
0

この投稿http://forums.asp.net/p/1401113/3032737.aspx#3032737は、 http://aspnet.codeplex.com/SourceControl/changeset/view/21528#338524から LinqBinaryModelBinder を使用することを提案しています。

登録したら

protected void Application_Start()
{
    ModelBinders.Binders.Add(typeof(Binary), new LinqBinaryModelBinder());
}

バインダーは自動的に Version フィールドを逆シリアル化します

public ActionResult VersionedUpdate(VersionedModel data) 
{ ... }

このようにレンダリング:

<%= Html.Hidden("Version") %>

( http://stephenwalther.com/blog/archive/2009/02/25/asp.net-mvc-tip-49-use-the-linqbinarymodelbinder-in-your.aspxも参照してください)

于 2009-06-15T20:17:51.687 に答える
0

ここのようにたくさんの方法があります

byte[] b = BitConverter.GetBytes(DateTime.Now.Ticks);//新しいバイト [(DateTime.Now).Ticks]; _store.Version = 新しい System.Data.Linq.Binary(b)

(あなたのバージョンをバインドして除外していることを確認してください)、

しかし、最善の方法は、DBに処理させることです...

于 2010-04-19T11:33:09.740 に答える