2011-07-19 12 views
24

私はMVC3アプリケーションで作業しています。私のクライアント側のViewModelには、SQL ServerのRowVersionプロパティが含まれています。これは、byte []です。これは、クライアント側でObject配列としてレンダリングされます。私のビューモデルをコントローラに投稿しようとすると、RowVersionプロパティは常にnullになります。MVC3 - バイト配列をコントローラにポストする - データベースRowVersion

Iは、コントローラシリアライザは(JsonValueProviderFactory)オブジェクトの配列プロパティを無視していると仮定しています。

私は、フォームのマークアップをJSONを掲載しておりませんように私は、しかし、これは適用されません、このブログを見てきました: http://thedatafarm.com/blog/data-access/round-tripping-a-timestamp-field-with-ef4-1-code-first-and-mvc-3/

私の見解はそうのように私のviewmodelをレンダリング:

<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); 
    } 
    } 
+0

ねえ、あなたはあなたのコントローラのアクションコードを投稿することができますか? – Tocco

+0

ちょっと@Darin Dimitrov、 'serialization'タグを追加できますか? – Tocco

+0

@Tocco、私はそれを追加しました。 –

答えて

36

私のクライアント側のViewModelは[]

バイトはので、それを確認しているSQL ServerのRowVersionプロパティが含まれていbyte[]の代わりにというプロパティが含まれており、base64の表現はbyte[]です。その後、元の文字列をBase64文字列から得ることができるように、クライアントに戻ってサーバーに戻って問題を起こすことはありません。

Json.NET
+0

+1オールドポストが絶対に今日の私の問題を解決しました。 – Nope

+1

'Convert.ToBase64String(byte [])' –

+0

とても良い解決策(+1)! – Christos

1

は自動的にBase64としてバイト配列をコードします。 https://gist.github.com/DavidDeSloovere/5689824から

あなたはJsonNetResultの代わりJsonResultを使用することができます

using System; 
using System.Web; 
using System.Web.Mvc; 
using Newtonsoft.Json; 
using Newtonsoft.Json.Serialization; 

public class JsonNetResult : JsonResult 
{ 
    public override void ExecuteResult(ControllerContext context) 
    { 
     if (context == null) 
     { 
      throw new ArgumentNullException("context"); 
     } 

     var response = context.HttpContext.Response; 

     response.ContentType = !string.IsNullOrEmpty(this.ContentType) ? this.ContentType : "application/json"; 

     if (this.ContentEncoding != null) 
     { 
      response.ContentEncoding = this.ContentEncoding; 
     } 

     if (this.Data == null) 
     { 
      return; 
     } 

     var jsonSerializerSettings = new JsonSerializerSettings(); 
     jsonSerializerSettings.DateFormatHandling = DateFormatHandling.IsoDateFormat; 
     jsonSerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver(); 
     var formatting = HttpContext.Current != null && HttpContext.Current.IsDebuggingEnabled ? Formatting.Indented : Formatting.None; 
     var serializedObject = JsonConvert.SerializeObject(Data, formatting, jsonSerializerSettings); 
     response.Write(serializedObject); 
    } 
} 

使用法:

[HttpPost] 
public JsonResult Save(Contact contact) { 
    return new JsonNetResult { Data = _contactService.Save(contact) }; 
} 
関連する問題