asp.net-mvc serialization razor byte rowversion

asp.net mvc - MVC3-publicación de matriz de bytes en un controlador-Database RowVersion



razor c# (2)

Mi ViewModel del lado del cliente contiene una propiedad RowVersion de SQL Server, que es un byte []

Haga que en lugar de un byte[] su modelo de vista contenga una propiedad de string que es la representación base64 de este byte[] . Entonces no tendrá ningún problema para pasarlo de vuelta al cliente y volver al servidor donde podrá obtener el byte[] original byte[] de la cadena Base64.

Estoy trabajando en una aplicación MVC3. Mi ViewModel del lado del cliente contiene una propiedad RowVersion de SQL Server, que es un byte []. Se representa como una matriz de Objetos en el lado del cliente. Cuando intento publicar mi modelo de vista en un controlador, la propiedad RowVersion siempre es nula.

Supongo que el serializador del controlador (JsonValueProviderFactory) está ignorando la propiedad del conjunto de objetos.

He visto este blog, sin embargo, esto no se aplica, ya que estoy publicando JSON y no el formulario de marcado: http://thedatafarm.com/blog/data-access/round-tripping-a-timestamp-field-with-ef4-1-code-first-and-mvc-3/

Mi vista representa mi modelo de vista así:

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

Luego publico viewModel en el controlador de esta manera:

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

Aquí está mi acción en el controlador:

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

ACTUALIZACIÓN: basada en la respuesta de Darin.

Esperaba una solución más limpia, pero dado que Darin me brindó la única respuesta, tendré que agregar una propiedad personalizada que serializará mi propiedad byte [] "row_version" en una cadena Base64. Y cuando la cadena Base64 se establece en la nueva propiedad personalizada, convierte la cadena de nuevo en un byte []. A continuación se muestra la propiedad personalizada "RowVersion" que agregué a mi modelo:

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


Json.NET codifica automáticamente las matrices de bytes como Base64.

Puede usar JsonNetResult lugar de JsonResult :

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

Uso:

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