Como atribuir valor ao campo de metadados do tipo data ou número?
-
12-12-2019 - |
Pergunta
Estou usando o código do link a seguir para processar campos de metadados:-
https://code.google.com/p/tridion-practice/wiki/ChangeContentOrMetadata
Mas quando tento atribuir valor ao campo de metadados do tipo data, recebo o seguinte erro de validação xml: -
"System.Servicemodel.FaultException`1 [Myporject.ServiceReference.coreServicefault]:Erro de validação XML.Razão:O elemento 'uuid:myUUID:dateField' é inválido - O valor '10/4/2012 03:04:00 AM' é inválido de acordo com seu tipo de dados 'http://www.w3.org/2001/XMLSchema:dateTime' - A string '10/4/2012 03:04:00 AM' não é um valor DateTime válido.(O detalhe da falha é igual a MyPorject.ServiceReference.coreServiceFault) "
Não importa se eu atribuo o valor como string ou tipo de dados DateTime, estou recebendo o mesmo erro, também tentei sobrecarregar o método AddValue com um tipo de dados Datetime, mas nada funcionou até agora.
Trecho de código do método AddValue: -
public void AddValue(string value1)
{
string value = string.IsNullOrEmpty(value1) ? null : value1; ;
XmlElement newElement = fields.AddFieldElement(definition);
if (value != null) newElement.InnerText = value;
}
Por favor, sugira uma solução para os tipos de dados Data e Número.desde já, obrigado
Solução 5
Depois de algumas soluções de problemas, finalmente resolvo o problema e junto com o formato da data.Para isso preciso combinar o fuso horário da minha máquina local com o fuso horário do servidor.
E abaixo está o código do método sobrecarregado: –
public void AddValue(DateTime value1)
{
DateTime value = value1 == null ? DateTime.MinValue : value1;
XmlElement newElement = fields.AddFieldElement(definition);
if (value != null) newElement.InnerText = value.ToString("yyyy-MM-ddThh:mm:ss");
}
Outras dicas
A mensagem de erro é bastante explícita sobre o fato de que o formato da data está errado: The string '10/4/2012 03:04:00 AM' is not a valid DateTime value
.
O formato que Tridion espera é YYYY-MM-DDThh:mm:ss
, portanto, sem espaço, sem fuso horário e sem marcador AM/PM.
Nas APIs oficiais do Tridion, você normalmente fica protegido de ter que fazer a conversão sozinho, já que elas aceitam DateTime
objetos e converta-os para o formato correto para você.Mas como a classe auxiliar que você usa não é uma API oficial, são necessários alguns atalhos e faz com que você defina o valor como um string
.
Eu normalmente uso datetime.ToString("u").Replace(" ", "T").Replace("Z", "")
para obter as datas no formato correto.
A String de data deve ter um formato como:
- AAAA-MM-DDThh:mm:ss
Exemplo:
- "2012-10-03T09:39:43"
Além disso, a forma como você está definindo a data me parece um pouco complexa, visto que você está usando o wrapper Conteúdo e Metadados, por que não algo assim:
string myStringDate = "2012-10-03T09:39:43";
fields["DateFieldName"].Value = myStringDate;
component.Metadata = fields.ToString();
De acordo com minha experiência em C#, esse erro ocorre devido a um problema de formato de data e hora.você pode tentar o código abaixo
DateTime.Now.ToUniversalTime().ToString("yyyy-MM-dd");
Não testei com o seu código, mas espero que funcione no seu caso.
Está faltando o separador 'T' entre a data e a hora no seu formato.Você mencionou que a data de saída está em um formato que você está tentando reinserir, mas o que quer que seja a saída pode ser formatado de qualquer maneira, e não necessariamente da maneira que você deve especificar a data.
Leia atentamente a especificação XMLSchema dateTime aqui: http://www.w3.org/TR/xmlschema-2/#dateTime