0

データベースには、SQL タイムスタンプである同時実行チェック フィールドがあります。

かみそりビューを使用している場合

@Html.HiddenFor(m => m.DatabaseRowVersion)

Base64 文字列にエンコードされ、保存アクションでモデルにバインドされます。

Jsonリクエストでフィールドを取得した場合

Json(queryable.Select(f => new { DatabaseRowVersion = f.DatabaseRowVersion }))

結果のJsonは8フィールドのバイト配列であり、保存アクションでモデルにバインドすることはできません。シリアル化される前に、Linq to Entities でフィールドを Base64 文字列として選択する方法はありますか?

私の解決策は、8 つのフィールド バイト配列を Base64 文字列に変換するための見栄えの悪い JavaScript 関数ですが、これはきれいではなく、元の Json リクエストが既にエンコードされているフィールドを返すことを望みます。私が試したすべてのことで、サポートされていない Linq to Entities 関数の例外が発生します。私はメモリ内でそれをしたくありません.SQLサーバー上でそれを実現するためのある種のEntities.Functionsスタイルを見つけたいと思っています。

私が気にしないもう1つの方法は、8フィールドのバイト配列をモデルのbyte []に​​バインドする何らかの方法で保存リクエストを投稿するようにjQueryを取得できる場合ですが、私が試したすべてが機能しません。私はすべての traditional: true および contentType: "application/json; charset=utf-8" を投稿で試しましたが、Ajax 投稿で配列を正常にバインドする他のアクションと同様に成功しませんでした。モデル バインダーは、モデルの byte[] フィールドのバイト配列ではなく、Base64 文字列を想定しているように見えるため、他の配列のようには機能しないようです。

4

1 に答える 1

0

まだ答えを探しているかどうかはわかりませんが、バイト配列を文字列に変換して元に戻すことで、これを解決できました。

string stringValue = System.Convert.ToBase64String(byteSource);
Byte[] byteValue = System.Convert.FromBase64String(stringSource);

あなたのケースでは、ViewModel を作成し、AutoMapperを使用して Model (Byte Array TimeStamp を持つ) と ViewModel (String TimeStamp を持つ) をマッピングできます。

最後に、ViewModel を使用してビューを作成し、更新時に ViewModel をモデルにマップし、そこから更新します。このようにして、隠しフィールドは文字列になり、現在抱えている問題は発生しません。

Automapper には Byte 配列から String への暗黙的な変換メソッドがないため、コンバーターに次のようなものを実装する必要があります。

public class ByteArrayTypeConverter : ITypeConverter<string, Byte[]>
    {
        public Byte[] Convert(ResolutionContext context)
        {
            string source = (string)context.SourceValue;
            if (source == null)
            {
                source = "";
            }

            Byte[] returnValue = System.Convert.FromBase64String(source);

            return returnValue;
        }
    }

    public class StringTypeConverter : ITypeConverter<Byte[], string>
    {
        public string Convert(ResolutionContext context)
        {
            Byte[] source = (Byte[])context.SourceValue;

            string returnValue = System.Convert.ToBase64String(source);

            return returnValue;
        }
    }

Mapping イニシャライザは次のようになります。

Mapper.CreateMap<string, Byte[]>().ConvertUsing(new ByteArrayTypeConverter());
Mapper.CreateMap<Byte[], string>().ConvertUsing(new StringTypeConverter());
Mapper.CreateMap<YourViewModel, YourModel);
Mapper.CreateMap<YourModel, YourViewModel>();

お役に立てれば。

于 2013-04-28T17:06:54.610 に答える