2011-01-25 14 views
11

Acabo de empezar a usar knockout y estoy teniendo problemas con Serialización y deserialización DateTime con el JavaScriptSerializer.Fecha de vinculación para eliminar el modelo de vista con el predeterminado JavaScriptSerializer

He actualizado el modelo de regalos en Steves koListEditor ejemplo de su blog para incluir un campo DateTime modificación:

public class GiftModel 
{ 
    public string Title { get; set; } 
    public double Price { get; set; } 
    public DateTime Modified { get; set; } 
} 

Entonces actualizado la Index.aspx para incluir el nuevo campo:

<asp:Content ContentPlaceHolderID="MainContent" runat="server"> 
    <h1>Gift list editor</h1> 

    <p>You have asked for <span data-bind="text: gifts().length">&nbsp;</span> gift(s)</p> 

    <form class="giftListEditor"> 
     <table> 
      <tbody data-bind="template: { name: 'giftRowTemplate', foreach: gifts }"></tbody> 
     </table> 

     <button data-bind="click: addGift">Add Gift</button> 
     <button data-bind="enable: gifts().length > 0" type="submit">Submit</button> 
    </form> 

    <script type="text/html" id="giftRowTemplate"> 
     <tr> 
      <td>Gift name: <input class="required" data-bind="value: Title, uniqueName: true"/></td> 
      <td>Price: \$ <input class="required number" data-bind="value: Price, uniqueName: true"/></td> 
      <td>Modified: <input class="required date" data-bind="value: Modified, uniqueName: true"/></td> 
      <td><a href="#" data-bind="click: function() { viewModel.removeGift($data) }">Delete</a></td> 
     </tr> 
    </script> 

    <script type="text/javascript"> 
     var initialData = <%= new JavaScriptSerializer().Serialize(Model) %>; 
     var viewModel = { 
      gifts : ko.observableArray(initialData), 

      addGift: function() { 
       this.gifts.push({ Title: "", Price: "", Modified:"" }); 
      }, 

      removeGift: function (gift) { 
       this.gifts.remove(gift); 
      }, 

      save: function() { 
       ko.utils.postJson(location.href, { gifts: this.gifts }); 
      } 
     }; 

     ko.applyBindings(document.body, viewModel); 
     $("form").validate({ submitHandler: function() { viewModel.save() } }); 
    </script> </asp:Content> 

Sin embargo, cuando el JavaScriptSerializer serializa el Modelo

var initialData = <%= new JavaScriptSerializer().Serialize(Model) %>; 

la fecha de modificación está saliendo de esta manera:

DateTime problem

También al usar fechas Reino Unido es decir, 25/01/2011 el JavaScriptSerializer.Deserialize desencadena la siguiente excepción:

25/01/2011 no es un valor válido para DateTime.

Aunque tengo 2 problemas aquí, la pregunta principal es si alguien ha utilizado con éxito knockout de MVC 2 y ha conseguido que el JavaScriptSerializer funcione con DateTimes? Me di cuenta de que podría escribir mi propia JavaScriptSerializer pero esperaba no era una solución ya preparada por ahí :)

Aquí está el código para la versión actualizada de koListEditor de Steve Sanderson:

Code on my skydrive

Gracias

de Dave

+0

Cualquiera que mire lo que antecede ... puede usar JSON.net para enviar fechas al cliente en el formato que desee ... ver http://james.newtonking.com/archive/2009/02/20/good -date-times-with-json-net.aspx – CraftyFella

Respuesta

18

Bueno, hay dos opciones. Puede hacer la solución simple teniendo un objeto de modelo de vista designado que almacena los valores de tiempo de fecha preformados como una cadena. Esto es generalmente lo que hago. Entonces puedo probar el valor de la fecha para la validación.

La otra opción sería implementar un enlace de datos personalizado. Puedes mirar haciendo eso here. Este sería el enfoque más elegante. Lo bueno de este apporach es que puedes crear tu código de generación de UI en el enlace, lo que te permite agregar el selector de fecha a la interfaz de usuario en el proceso.

+1

Nice dude .. like the custom binding approach ...Como le dije al otro amigo ... al final encontré que JSON.net era la solución más fácil ... ya que nos permitía enviar las fechas al cliente en el formato que queríamos. – CraftyFella

+0

Sí, un gran fan de el enfoque de enlaces personalizados. Espero no excederme en mi proyecto, pero hace que el HTML sea tan limpio. –

+1

[Un ejemplo de un controlador de enlace personalizado para las fechas] (http://everythingjs.blogspot.fr/2012/03/json-dates-and-knockoutjs-date-binding.html) – chrisb

1
No

una solución elegante, pero funciona:

data-bind="value: eval('new ' + Modified.slice(1,-1)), uniqueName: true"

Eval podría ser un problema de seguridad aquí, dependiendo del contexto.

+1

Al final encontré una solución. Utilicé JSON.net, lo que le permite especificar su propio formato de fecha. http://james.newtonking.com/archive/2009/02/20/good-date-times-with-json-net.aspx funciona de maravilla .. – CraftyFella

Cuestiones relacionadas