私はMVC3アプリケーションに取り組んでいます。クライアント側のViewModelには、byte[]であるSQLServerRowVersionプロパティが含まれています。クライアント側でオブジェクト配列としてレンダリングされます。ビューモデルをコントローラーに投稿しようとすると、RowVersionプロパティは常にnullになります。
Controllerシリアライザー(JsonValueProviderFactory)がObject配列プロパティを無視していると想定しています。
私はこのブログを見ましたが、フォームのマークアップではなくJSONを投稿しているため、これは当てはまりません:http: //thedatafarm.com/blog/data-access/round-tripping-a-timestamp-field-with-ef4 -1-code-first-and-mvc-3 /
私のビューは私のビューモデルを次のようにレンダリングします:
<script type="text/javascript">
var viewModel = @Html.Raw( Json.Encode( this.Model ) );
</script>
次に、viewModelを次のようにコントローラーに投稿します。
var data = {
'contact': viewModel
};
$.ajax({
type: 'POST',
url: '/Contact/Save',
contentType: "application/json; charset=utf-8",
data: JSON.stringify(data),
dataType: 'json',
success: function (data) {
// Success
},
error: function (XMLHttpRequest, textStatus, errorThrown) {
alert(XMLHttpRequest.responseText);
}
});
これがコントローラーでの私のアクションです:
[HttpPost]
public JsonResult Save(Contact contact) {
return this.Json( this._contactService.Save( contact ) );
}
更新:ダリンの答えに基づいています。
よりクリーンなソリューションを望んでいましたが、Darinが唯一の答えを提供したので、byte[]"row_version"プロパティをBase64文字列にシリアル化するカスタムプロパティを追加する必要があります。また、Base64文字列が新しいカスタムプロパティに設定されると、文字列がbyte[]に変換されます。以下は、モデルに追加したカスタムの「RowVersion」プロパティです。
public byte[] row_version {
get;
set;
}
public string RowVersion {
get {
if( this.row_version != null )
return Convert.ToBase64String( this.row_version );
return string.Empty;
}
set {
if( string.IsNullOrEmpty( value ) )
this.row_version = null;
else
this.row_version = Convert.FromBase64String( value );
}
}