Eu tenho uma ação de controlador que efetivamente simplesmente retorna um JsonResult do meu modelo. Portanto, no meu método, tenho algo como o seguinte:
return new JsonResult(myModel);
Isso funciona bem, exceto por um problema. Há uma propriedade de data no modelo e isso parece ser retornado no resultado Json da seguinte forma:
"\/Date(1239018869048)\/"
Como devo lidar com as datas para que elas sejam retornadas no formato exigido? Ou como eu manejo esse formato acima no script?
javascript
asp.net-mvc
json
Jon Archway
fonte
fonte
Respostas:
Apenas para expandir a resposta do casperOne .
A especificação JSON não considera valores de data. A MS teve que fazer uma ligação, e o caminho que eles escolheram foi explorar um pequeno truque na representação javascript de strings: a string literal "/" é igual a "\ /", e uma string literal nunca será serializada como " \ / "(mesmo" \ / "deve ser mapeado para" \\ / ").
Consulte http://msdn.microsoft.com/en-us/library/bb299886.aspx#intro_to_json_topic2 para obter uma explicação melhor (role para baixo até "De literais em JavaScript para JSON")
Uma solução seria apenas analisá-lo:
No entanto, ouvi dizer que há uma configuração em algum lugar para fazer com que o serializador produza
DateTime
objetos com anew Date(xxx)
sintaxe. Vou tentar descobrir isso.O segundo parâmetro de
JSON.parse()
aceita umareviver
função onde prescreve como o valor originalmente produzido por, antes de ser retornado.Aqui está um exemplo de data:
Veja os documentos de JSON.parse ()
fonte
parseInt()
. Diz à função para extrair um número inteiro no sistema numérico da base 10. É uma mistura. Se você colocar8
lá, extrairia um número octal.Aqui está a minha solução em Javascript - muito parecida com a do JPot, mas mais curta (e possivelmente um pouco mais rápida):
"value.substr (6)" remove a parte "/ Date (" e a função parseInt ignora os caracteres não numéricos que ocorrem no final.
EDIT: Eu intencionalmente deixei de fora a raiz (o segundo argumento para analisarInt); veja meu comentário abaixo . Além disso, observe que as datas ISO-8601 são preferidas a esse formato antigo - portanto, esse formato geralmente não deve ser usado para novos desenvolvimentos. Veja a excelente biblioteca Json.NET para uma ótima alternativa que serializa datas usando o formato ISO-8601.
Para datas JSON no formato ISO-8601, basta passar a string para o construtor Date:
fonte
value.substr(6, 13)
para remover os outros caracteres não numéricos. Mas se você fizer isso, todas as datas ANTES de 26/04/1938 são inválidas! Não sabíamosparseInt
que ignoraria os caracteres não numéricos. Obrigado!parseInt
deve ignorar os zeros à esquerda a partir do ECMAScript ed 5 (2011).Existem algumas respostas para lidar com isso no lado do cliente, mas você pode alterar o lado do servidor de saída, se desejar.
Existem algumas maneiras de abordar isso, vou começar com o básico. Você precisará subclassificar a classe JsonResult e substituir o método ExecuteResult. A partir daí, você pode adotar algumas abordagens diferentes para alterar a serialização.
Abordagem 1: A implementação padrão usa o JsonScriptSerializer . Se você der uma olhada na documentação, poderá usar o método RegisterConverters para adicionar JavaScriptConverters personalizados . Existem alguns problemas com isso: o JavaScriptConverter serializa em um dicionário, ou seja, pega um objeto e serializa em um dicionário Json. Para tornar o objeto serializado em uma string, é necessário um pouco de hackery, veja post . Este hack particular também escapará da string.
Abordagem 2 (recomendada): A segunda abordagem é começar com o JsonResult substituído e ir com outro serializador Json, no meu caso, o serializador Json.NET . Isso não requer a invasão da abordagem 1. Aqui está minha implementação da subclasse JsonResult:
Exemplo de uso:
Créditos adicionais: James Newton-King
fonte
Moment.js é uma extensa biblioteca de data e hora que também suporta isso. http://momentjs.com/docs/#/parsing/asp-net-json-dates/
ex: momento ("/ Data (1198908717056-0700) /")
Isso pode ajudar. saída do plunker
fonte
moment("json_date_string_value").format('appropriate format');
você pode ver os valores de formato diferente na página momet.jsDescobri que criar um novo
JsonResult
e retornar não é satisfatório - ter que substituir todas as chamadasreturn Json(obj)
porreturn new MyJsonResult { Data = obj }
é uma dor.Então eu pensei, por que não apenas seqüestrar o
JsonResult
uso de umActionFilter
:Isso pode ser aplicado a qualquer método que retorne a
JsonResult
para usar o JSON.Net:que responderá com
como desejado!
Você pode, se não se importar em chamar a
is
comparação a cada solicitação, adicione isso ao seuFilterConfig
:e todo o seu JSON agora será serializado com o JSON.Net em vez do incorporado
JavaScriptSerializer
.fonte
Usando o jQuery para converter automaticamente datas com
$.parseJSON
Como você está usando o Asp.net MVC, suspeito que esteja usando o jQuery no lado do cliente. Sugiro que você leia esta postagem do blog que possui um código como usar
$.parseJSON
para converter automaticamente datas para você.O código suporta datas formatadas em Asp.net, como as mencionadas, bem como datas formatadas em ISO. Todas as datas serão formatadas automaticamente para você usando
$.parseJSON()
.fonte
A comunicação Ajax entre o cliente e o servidor geralmente envolve dados no formato JSON. Embora o JSON funcione bem para strings, números e booleanos, ele pode apresentar algumas dificuldades para datas devido à maneira como o ASP.NET as serializa. Como não possui representação especial para datas, elas são serializadas como strings simples. Como solução, o mecanismo de serialização padrão do ASP.NET Web Forms e MVC serializa datas em um formato especial - / Data (ticks) / - em que ticks é o número de milissegundos desde 1 de janeiro de 1970.
Este problema pode ser resolvido de duas maneiras:
lado do cliente
Converta a sequência de datas recebida em um número e crie um objeto de data usando o construtor da classe date com os ticks como parâmetro.
lado do servidor
A solução anterior usa um script do lado do cliente para converter a data em um objeto Data JavaScript. Você também pode usar o código do lado do servidor que serializa instâncias do .NET DateTime no formato de sua escolha. Para realizar essa tarefa, você precisa criar seu próprio ActionResult e serializar os dados da maneira que desejar.
referência: http://www.developer.com/net/dealing-with-json-dates-in-asp.net-mvc.html
fonte
Eu tive o mesmo problema e, em vez de retornar o valor da data real, usei o ToString ("dd MMM aaaa") nele. Em seguida, no meu javascript, usei a nova data (valor do dado), em que o valor do dado pode ser "01 de janeiro de 2009".
fonte
ToString("o")
?Veja este tópico:
http://forums.asp.net/p/1038457/1441866.aspx#1441866
Basicamente, enquanto o
Date()
formato é javascript válido, NÃO é JSON válido (há uma diferença). Se você deseja o formato antigo, provavelmente precisará criar uma fachada e transformar o valor por conta própria, ou encontrar uma maneira de acessar o serializador para seu tipoJsonResult
e usar um formato personalizado para datas.fonte
Não é a maneira mais elegante, mas isso funcionou para mim:
fonte
Eu tenho trabalhado em uma solução para esse problema, pois nenhuma das respostas acima realmente me ajudou. Estou trabalhando com o calendário da semana do jquery e precisava que minhas datas tivessem informações de fuso horário no servidor e localmente na página. Depois de pesquisar um pouco, descobri uma solução que pode ajudar os outros.
Estou usando o asp.net 3.5, vs 2008, asp.net MVC 2 e jquery week calendar,
Primeiro, estou usando uma biblioteca escrita por Steven Levithan que ajuda a lidar com datas no lado do cliente, a biblioteca de datas de Steven Levithan . O formato isoUtcDateTime é perfeito para o que eu precisava. Na minha chamada AJAX do jquery, uso a função format fornecida com a biblioteca com o formato isoUtcDateTime e quando a chamada ajax atinge meu método de ação, o datetime Kind é definido como local e reflete a hora do servidor.
Quando envio datas para minha página via AJAX, as envio como sequências de texto formatando as datas usando "ddd, dd MMM aaaa HH ':' mm ':' ss 'GMT'zzzz". Esse formato é facilmente convertido no lado do cliente usando
Aqui está minha solução completa, menos a fonte de Steve Levithan, que você pode baixar:
Controlador:
Javascript:
Espero que este exemplo rápido ajude outras pessoas na mesma situação em que eu estava. No momento, parece funcionar muito bem com a serialização JSON da Microsoft e mantém minhas datas corretas nos fusos horários.
fonte
A melhor maneira de lidar com datas no knockoutjs é usar a biblioteca de momentos e lidar com datas como o chefe. Você pode lidar facilmente com datas como / Data (-62135578800000) /. Não há necessidade de se preocupar com a data de serialização no controlador.
use-o como
O momentjs suporta muitos formatos de data e funções utilitárias em datas.
fonte
Formate a data na consulta.
O único problema com esta solução é que você não obterá nenhum resultado se QUALQUER valor da data for nulo. Para contornar isso, você pode colocar instruções condicionais na sua consulta ANTES de selecionar a data que ignora os valores nulos da data ou configurar uma consulta para obter todos os resultados e percorrer todas essas informações usando um loop foreach e atribuir um valor para todas as datas que são nulas ANTES de fazer seu SELECT novo.
Exemplo de ambos:
A segunda opção requer outra consulta inteiramente, para que você possa atribuir valores a todos os nulos. Esse e o loop foreach teriam que ser ANTES da sua consulta que seleciona os valores.
Apenas uma ideia que achei mais fácil do que todos os exemplos de javascript.
fonte
Você pode usar este método:
fonte
0 0
No seu cshtml,
No seu arquivo JS, talvez app.js,
Fora do app.controller, adicione o filtro abaixo.
Aqui, a "minha data" é a função que você está chamando para analisar a data. Aqui, o "app" é a variável que contém o angular.module
fonte
adicione o plugin jquery ui na sua página.
fonte
Não é por nada, mas existe outro caminho. Primeiro, construa sua consulta LINQ. Em seguida, construa uma consulta do resultado enumerado e aplique qualquer tipo de formatação que funcione para você.
Devo dizer que o passo extra é irritante, mas funciona muito bem.
fonte
O que funcionou para mim foi criar um viewmodel que contivesse a propriedade date como uma string. Atribuindo a propriedade DateTime a partir do modelo de domínio e chamando o .ToString () na propriedade date enquanto atribui o valor ao viewmodel.
Um resultado JSON de um método de ação MVC retornará a data em um formato compatível com a visualização.
Ver modelo
Modelo de domínio
Método de Ação do Controlador
fonte
Substitua os controladores Json / JsonResult para retornar JSON.Net:
Isso funciona um tratamento
fonte
Irritante, não é?
Minha solução foi alterar meu serviço WCF para que ele retornasse o DateTimes em um formato mais legível (não Microsoft). Observe abaixo "
UpdateDateOriginal
", que é o formato padrão de datas do WCF, e meu "UpdateDate
", que está formatado para algo mais legível.Veja como fazê-lo:
Alterando o formato da data do WCF
Espero que isto ajude.
fonte
Eu achei que essa era a maneira mais fácil de mudar o lado do servidor.
fonte
Tive vários problemas com as datas JSON e decidi me livrar do problema resolvendo o problema de data no SQL. Alterar o formato da data para um formato de sequência
Usando o fldDateStr, o problema desapareceu e eu ainda poderia usar o campo de data para classificação ou outros fins.
fonte
Ele retorna o formato de data do servidor. Você precisa definir sua própria função.
fonte
Aqui está um código JavaScript que escrevi que define um
<input type="date">
valor a partir de uma data passada do ASP.NET MVC.Você chama essa função assim:
Onde
commissionStartDate
é a data JSON passada pelo MVC.fonte
O mais fácil:
var milisegundos = parseInt (data.replace ("/ Date (", "") .replace (") /", "")));
Var newDate = new Date (milisegundos). toLocaleDateString ("en-UE");
fonte