如何为日期或数字类型的元数据字段赋值?

时间:2012-10-03 05:21:33

标签: tridion tridion-2011 core-services

我使用以下链接的代码来处理元数据字段: -

https://code.google.com/p/tridion-practice/wiki/ChangeContentOrMetadata

但是当我尝试为日期类型的元数据字段赋值时,我得到以下xml验证错误: -

” System.ServiceModel.FaultException`1 [myPorject.serviceReference.CoreServiceFault]:XML验证错误。原因:'uuid:myUUID:dateField'元素无效 - 根据其数据类型'http://www.w3.org/2001/XMLSchema,值'10 / 4/2012 03:04:00 AM'无效: dateTime' - 字符串'10 / 4/2012 03:04:00 AM'不是有效的DateTime值..(故障详细信息等于 myPorject.serviceReference.CoreServiceFault)“

无论我将值分配为字符串还是DateTime数据类型我都得到相同的错误,我还尝试使用Datetime数据类型重载AddValue方法,但到目前为止还没有任何工作。

AddValue方法的代码段: -

     public void AddValue(string value1)
    {
        string value = string.IsNullOrEmpty(value1) ? null : value1; ;
        XmlElement newElement = fields.AddFieldElement(definition);
        if (value != null) newElement.InnerText = value;
    }

请为Date和Number数据类型建议解决方案。提前致谢

5 个答案:

答案 0 :(得分:6)

错误消息非常清楚您的日期格式错误:The string '10/4/2012 03:04:00 AM' is not a valid DateTime value

Tridion期望的格式为YYYY-MM-DDThh:mm:ss,因此没有空格,没有时区,也没有AM / PM标记。

在官方的Tridion API中,您通常不必自己进行转换,因为它们接受DateTime个对象并将其转换为正确的格式。但由于您使用的助手类不是官方API,因此需要一些快捷方式,并将您设置为string

我通常使用 datetime.ToString("u").Replace(" ", "T").Replace("Z", "") 以正确的格式获取日期。

答案 1 :(得分:5)

日期字符串的格式应为:

  • YYYY-MM-DDTHH:MM:SS

示例:

  • “2012-10-03T09:39:43”

除此之外,您设置日期的方式对我来说似乎有点复杂,因为您使用的是内容和元数据包装器,为什么不是这样的:

string myStringDate = "2012-10-03T09:39:43";
fields["DateFieldName"].Value = myStringDate;
component.Metadata = fields.ToString();

答案 2 :(得分:2)

根据我的C#体验,此类错误是由于日期时间格式问题引起的。 你可以尝试下面的代码

DateTime.Now.ToUniversalTime().ToString("yyyy-MM-dd");

我没有使用您的代码对其进行测试,但希望它可以适用于您的情况。

答案 3 :(得分:1)

您在格式中缺少日期和时间之间的“T”分隔符。您确实提到输出的日期是您尝试重新插入的格式,但输出的内容无论如何都可以格式化,而不一定是您必须指定日期的方式。

在此处仔细阅读XMLSchema dateTime规范:http://www.w3.org/TR/xmlschema-2/#dateTime

答案 4 :(得分:0)

经过一些麻烦后我终于解决了这个问题以及日期格式。为此,我需要将本地计算机的时区与服务器的时区进行匹配。

以下是重载方法的代码: -

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