Tengo una acción de controlador que efectivamente simplemente devuelve un JsonResult de mi modelo. Entonces, en mi método tengo algo como lo siguiente:
return new JsonResult(myModel);
Esto funciona bien, excepto por un problema. Hay una propiedad de fecha en el modelo y parece que se devuelve en el resultado de Json así:
"\/Date(1239018869048)\/"
¿Cómo debo tratar con las fechas para que se devuelvan en el formato que requiero? ¿O cómo manejo este formato anterior en el script?
javascript
asp.net-mvc
json
Jon Archway
fuente
fuente
Respuestas:
Solo para ampliar la respuesta de casperOne .
La especificación JSON no tiene en cuenta los valores de fecha. MS tuvo que hacer una llamada, y la ruta que eligieron fue explotar un pequeño truco en la representación de cadenas de JavaScript: el literal de cadena "/" es el mismo que "\ /", y un literal de cadena nunca se serializará en " \ / "(incluso" \ / "debe asignarse a" \\ / ").
Consulte http://msdn.microsoft.com/en-us/library/bb299886.aspx#intro_to_json_topic2 para obtener una mejor explicación (desplácese hasta "De JavaScript Literals a JSON")
Una solución sería simplemente analizarlo:
Sin embargo, he escuchado que hay una configuración en algún lugar para que el serializador genere
DateTime
objetos con lanew Date(xxx)
sintaxis. Trataré de sacar eso.El segundo parámetro de
JSON.parse()
acepta unareviver
función donde prescribe cómo el valor originalmente producido por, antes de ser devuelto.Aquí hay un ejemplo para la fecha:
Ver los documentos de JSON.parse ()
fuente
parseInt()
. Le dice a la función que extraiga un número entero en el sistema de numeración base 10. Es una radix. Si lo pones8
allí, extraería un número octal.Aquí está mi solución en Javascript, muy parecida a la de JPot, pero más corta (y posiblemente un poco más rápida):
"value.substr (6)" elimina la parte "/ Date (", y la función parseInt ignora los caracteres que no son números que aparecen al final.
EDITAR: He omitido intencionalmente la raíz (el segundo argumento de parseInt); mira mi comentario a continuación . Además, tenga en cuenta que las fechas ISO-8601 son preferibles a este formato antiguo, por lo que este formato generalmente no debe usarse para nuevos desarrollos. Vea la excelente biblioteca Json.NET para una gran alternativa que serializa fechas usando el formato ISO-8601.
Para las fechas JSON con formato ISO-8601, simplemente pase la cadena al constructor Fecha:
fuente
value.substr(6, 13)
eliminar los otros caracteres no numéricos. Pero si haces eso, ¡todas las fechas ANTES del 26/04/1938 no son válidas! No sabíamosparseInt
que ignoraría los caracteres no numéricos. ¡Gracias!parseInt
debe ignorar los ceros iniciales a partir de ECMAScript ed 5 (2011).Hay bastantes respuestas para manejarlo del lado del cliente, pero puede cambiar el lado del servidor de salida si lo desea.
Hay algunas maneras de abordar esto, comenzaré con lo básico. Tendrá que subclasificar la clase JsonResult y anular el método ExecuteResult. A partir de ahí, puede tomar algunos enfoques diferentes para cambiar la serialización.
Enfoque 1: la implementación predeterminada utiliza el JsonScriptSerializer . Si echa un vistazo a la documentación, puede usar el método RegisterConverters para agregar JavaScriptConverters personalizados . Sin embargo, hay algunos problemas con esto: el convertidor de JavaScript serializa en un diccionario, es decir, toma un objeto y serializa en un diccionario Json. Para que el objeto se serialice en una cadena, requiere un poco de piratería informática, vea la publicación . Este truco en particular también escapará de la cadena.
Enfoque 2 (recomendado): el segundo enfoque es comenzar con el JsonResult reemplazado e ir con otro serializador Json, en mi caso el serializador Json.NET . Esto no requiere la piratería del enfoque 1. Aquí está mi implementación de la subclase JsonResult:
Ejemplo de uso:
Créditos adicionales: James Newton-King
fuente
Moment.js es una extensa biblioteca de fecha y hora que también es compatible con esto. http://momentjs.com/docs/#/parsing/asp-net-json-dates/
ej .: momento ("/ Fecha (1198908717056-0700) /")
Podría ayudar. salida de plunker
fuente
moment("json_date_string_value").format('appropriate format');
, puede ver diferentes valores de formato en la páginaHe encontrado que la creación de un nuevo
JsonResult
y volver que no es satisfactorio - tener que reemplazar todas las llamadas areturn Json(obj)
lareturn new MyJsonResult { Data = obj }
es un dolor.Así que pensé, ¿por qué no solo secuestrar el
JsonResult
uso de unActionFilter
:Esto se puede aplicar a cualquier método que devuelva
JsonResult
a utilizar JSON.Net en su lugar:que responderá con
¡como se desee!
Si no le importa llamar a la
is
comparación en cada solicitud, puede agregar esto a suFilterConfig
:y todo su JSON ahora se serializará con JSON.Net en lugar del incorporado
JavaScriptSerializer
.fuente
Usando jQuery para convertir automáticamente fechas con
$.parseJSON
Como estás usando Asp.net MVC, sospecho que estás usando jQuery en el lado del cliente. Le sugiero que lea esta publicación de blog que tiene un código de cómo usarla
$.parseJSON
para convertir fechas automáticamente.El código admite fechas con formato Asp.net como las que mencionó, así como fechas con formato ISO. Todas las fechas se formatearán automáticamente mediante el uso
$.parseJSON()
.fuente
La comunicación Ajax entre el cliente y el servidor a menudo involucra datos en formato JSON. Si bien JSON funciona bien para cadenas, números y booleanos, puede presentar algunas dificultades para las fechas debido a la forma en que ASP.NET los serializa. Como no tiene ninguna representación especial para las fechas, se serializan como cadenas simples. Como solución, el mecanismo de serialización predeterminado de ASP.NET Web Forms y MVC serializa fechas en una forma especial - / Date (ticks) / - donde ticks es el número de milisegundos desde el 1 de enero de 1970.
Este problema se puede resolver de 2 maneras:
lado del cliente
Convierta la cadena de fecha recibida en un número y cree un objeto de fecha usando el constructor de la clase de fecha con los ticks como parámetro.
lado del servidor
La solución anterior usa una secuencia de comandos del lado del cliente para convertir la fecha en un objeto Fecha de JavaScript. También puede usar el código del lado del servidor que serializa las instancias de .NET DateTime en el formato que elija. Para realizar esta tarea, debe crear su propio ActionResult y luego serializar los datos de la manera que desee.
referencia: http://www.developer.com/net/dealing-with-json-dates-in-asp.net-mvc.html
fuente
Tuve el mismo problema y, en lugar de devolver el valor de fecha real, simplemente usé ToString ("dd MMM aaaa") en él. Luego, en mi javascript, utilicé una nueva Fecha (valor de fecha), donde el valor de fecha puede ser "01 de enero de 2009".
fuente
ToString("o")
?Ver este hilo:
http://forums.asp.net/p/1038457/1441866.aspx#1441866
Básicamente, si bien el
Date()
formato es javascript válido, NO es JSON válido (hay una diferencia). Si desea el formato anterior, probablemente tendrá que crear una fachada y transformar el valor usted mismo, o encontrar una forma de obtener el serializador para su tipo en elJsonResult
y hacer que use un formato personalizado para las fechas.fuente
No es la forma más elegante, pero esto funcionó para mí:
fuente
He estado trabajando en una solución a este problema ya que ninguna de las respuestas anteriores realmente me ayudó. Estoy trabajando con el calendario de la semana jquery y necesitaba mis fechas para tener información de zona horaria en el servidor y localmente en la página. Después de investigar un poco, descubrí una solución que puede ayudar a otros.
Estoy usando asp.net 3.5, vs 2008, asp.net MVC 2 y jquery week calendar,
Primero, estoy usando una biblioteca escrita por Steven Levithan que ayuda a manejar las fechas en el lado del cliente, la biblioteca de fechas de Steven Levithan . El formato isoUtcDateTime es perfecto para lo que necesitaba. En mi llamada jquery AJAX utilizo la función de formato proporcionada con la biblioteca con el formato isoUtcDateTime y cuando la llamada ajax llega a mi método de acción, datetime Kind se establece en local y refleja la hora del servidor.
Cuando envío fechas a mi página a través de AJAX, las envío como cadenas de texto formateando las fechas usando "ddd, dd MMM aaaa HH ':' mm ':' ss 'GMT'zzzz". Este formato se convierte fácilmente del lado del cliente usando
Aquí está mi solución completa menos la fuente de Steve Levithan, que puede descargar:
Controlador:
Javascript:
Espero que este ejemplo rápido ayude a otros en la misma situación en la que me encontraba. En este momento parece funcionar muy bien con la serialización JSON de Microsoft y mantiene mis fechas correctas en todas las zonas horarias.
fuente
La mejor manera de manejar fechas en knockoutjs es usar la biblioteca de momentos y manejar fechas como boss. Puede manejar fácilmente fechas como / Fecha (-62135578800000) /. No hay necesidad de preocuparse por cómo se serializa la fecha en el controlador.
úsalo como
momentjs admite muchos formatos de fecha y hora y funciones de utilidad en fechas.
fuente
Formatee la fecha dentro de la consulta.
El único problema con esta solución es que no obtendrá ningún resultado si CUALQUIERA de los valores de fecha son nulos. Para evitar esto, puede poner declaraciones condicionales en su consulta ANTES de seleccionar la fecha que ignora los valores nulos de fecha o puede configurar una consulta para obtener todos los resultados y luego recorrer toda esa información usando un ciclo foreach y asignar un valor a todas las fechas que son nulas ANTES de hacer su SELECCIÓN nueva.
Ejemplo de ambos:
La segunda opción requiere otra consulta por completo para que pueda asignar valores a todos los valores nulos. Esto y el bucle foreach tendrían que ser ANTES de su consulta que selecciona los valores.
Solo una idea que encontré más fácil que todos los ejemplos de JavaScript.
fuente
Puedes usar este método:
fuente
0 0
En tu cshtml,
En su archivo JS, tal vez app.js,
Fuera de app.controller, agregue el siguiente filtro.
Aquí "mydate" es la función que está llamando para analizar la fecha. Aquí la "aplicación" es la variable que contiene el módulo angular.
fuente
agregue el complemento jquery ui en su página.
fuente
No por nada, pero hay otra manera. Primero, construya su consulta LINQ. Luego, construya una consulta del resultado Enumerado y aplique cualquier tipo de formato que funcione para usted.
Tengo que decir que el paso adicional es molesto, pero funciona muy bien.
fuente
Lo que funcionó para mí fue crear un modelo de vista que contuviera la propiedad de fecha como una cadena. Asignando la propiedad DateTime del modelo de dominio y llamando a .ToString () en la propiedad date mientras asigna el valor al modelo de vista.
Un resultado JSON de un método de acción MVC devolverá la fecha en un formato compatible con la vista.
Ver modelo
Modelo de dominio
Método de acción del controlador
fuente
Anule los controladores Json / JsonResult para devolver JSON.Net:
Esto funciona de maravilla
fuente
Molesto, ¿no es así?
Mi solución fue cambiar mi servicio WCF para que devolviera DateTimes en un formato más legible (que no sea Microsoft). Observe a continuación, el "
UpdateDateOriginal
", que es el formato predeterminado de fechas de WCF, y mi "UpdateDate
", que está formateado en algo más legible.Aquí se explica cómo hacerlo:
Cambio de formato de fecha WCF
Espero que esto ayude.
fuente
Encontré que esta es la forma más fácil de cambiarlo del lado del servidor.
fuente
Tuve una serie de problemas con las fechas JSON y decidí deshacerme del problema abordando el problema de la fecha en el SQL. Cambiar el formato de fecha a un formato de cadena
Al usar fldDateStr, el problema desapareció y aún podría usar el campo de fecha para ordenar u otros fines.
fuente
Devuelve el formato de fecha del servidor. Necesita definir su propia función.
fuente
Aquí hay un código JavaScript que escribí que establece un
<input type="date">
valor a partir de una fecha pasada desde ASP.NET MVC.Llama a esta función así:
¿Dónde
commissionStartDate
está la fecha JSON aprobada por MVC?fuente
La más fácil:
var milisegundos = parseInt (data.replace ("/ Date (", "") .replace (") /", ""));
Var newDate = new Date (milisegundos). toLocaleDateString ("en-UE");
fuente