2011-07-19 12 views
24

Pracuję nad aplikacją MVC3. Moja strona ViewModel po stronie klienta zawiera właściwość RowVersion programu SQL Server, która jest bajtem []. Jest on renderowany jako tablica obiektów po stronie klienta. Kiedy próbuję opublikować mój model widoku do kontrolera, właściwość RowVersion ma zawsze wartość NULL.MVC3 - umieszczanie tablicy bajtów w kontrolerze - Database RowVersion

Zakładam, że Serializator kontrolera (JsonValueProviderFactory) ignoruje właściwość array obiektu.

Widziałem ten blog, jednak ten nie ma zastosowania, ponieważ jestem delegowania JSON, a nie znaczników forma: http://thedatafarm.com/blog/data-access/round-tripping-a-timestamp-field-with-ef4-1-code-first-and-mvc-3/

Moim zdaniem czyni moje ViewModel tak:

<script type="text/javascript"> 
    var viewModel = @Html.Raw(Json.Encode(this.Model)); 
</script> 

I wtedy zakładać ViewModel do sterownika tak:

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

Oto moje działanie w kontrolerze:

[HttpPost] 
    public JsonResult Save(Contact contact) { 
    return this.Json(this._contactService.Save(contact)); 
    } 

AKTUALIZACJA: na podstawie odpowiedzi Darina.

Miałem nadzieję na czystsze rozwiązanie, ale ponieważ Darin dostarczył jedyną odpowiedź, będę musiał dodać niestandardową właściwość, która będzie szeregować moją bajtową właściwość [] "row_version" do łańcucha Base64. A gdy ciąg Base64 jest ustawiony na nową właściwość niestandardową, konwertuje ciąg z powrotem na bajt []. Poniżej znajduje się nieruchomość zwyczaj „RowVersion”, które dodałem do mojego modelu

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

Hej, można pisać kod działania kontrolera? – Tocco

+0

Hej @Darin Dimitrov, czy możesz dodać znacznik 'serializacja'? – Tocco

+0

@Tocco, dodałem go. –

Odpowiedz

36

mojej stronie klienta ViewModel zawiera właściwość RowVersion SQL Server, który jest byte []

sprawiają, że tak że zamiast modelu byte[] Twój model widoku zawiera właściwość string, którą jest base64 reprezentacja tego byte[]. Wtedy nie będziesz mieć problemów z powrotem do klienta i z powrotem do serwera, gdzie będziesz mógł pobrać oryginalny kod byte[] z łańcucha Base64.

+0

+1 Old post, ale absolutnie rozwiązał mój problem już dziś. – Nope

+1

'Convert.ToBase64String (byte [])' –

+0

bardzo ładne rozwiązanie (+1)! – Christos

1

Json.NET automatycznie koduje tablice bajtowe jako Base64.

Można użyć JsonNetResult zamiast JsonResult:

z https://gist.github.com/DavidDeSloovere/5689824:

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

Zastosowanie:

[HttpPost] 
public JsonResult Save(Contact contact) { 
    return new JsonNetResult { Data = _contactService.Save(contact) }; 
} 
Powiązane problemy