【问题标题】:How to assign value to metadata field of date or number type?如何为日期或数字类型的元数据字段赋值?
【发布时间】:2012-09-24 00:24:46
【问题描述】:

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

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 方法的代码 sn-p:-

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

请为日期和数字数据类型提出解决方案。提前致谢

【问题讨论】:

    标签: tridion tridion-2011 core-services


    【解决方案1】:

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

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

    我尚未使用您的代码对其进行测试,但希望它适用于您的情况。

    【讨论】:

    • 不,与日期格式无关,我已经试过了。
    • @Ram:我通常使用datetime.ToString("u").Replace(" ", "T").Replace("Z", "") 来获取正确格式的日期。
    • 感谢 Frank 补充知识 :-)
    【解决方案2】:

    日期字符串应具有如下格式:

    • 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();
    

    【讨论】:

    • 我认为这个问题与日期格式无关,因为如果我手动创建多媒体组件并预览其元数据字段,那么日期字段在 fromat 中的值为 "mm/d/yyyy h:MM :ss tt" for ex:- 10/9/2012 5:11:54 PM 但如果我尝试以这种格式分配日期,那么即使我得到同样的异常。
    • 预览以不同格式显示日期的事实来自您的模板代码以该格式输出的事实。在内部,它使用T 而不是空格和24 小时格式而不是AM/PM 存储。只要试试 Puntero 的代码,你就会发现他是对的。
    • yyyy-MM-ddThh:mm:ss"
    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

      错误消息非常明确地表明您的日期格式错误: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", "") 来获取正确格式的日期。

      【讨论】:

      • datetime.ToString("yyyy-MM-ddTHH:mm:ss")
      • 但我真的很喜欢我的变体中的魔法 "u"。它发送那些阅读为 API 文档运行的代码的人——或者这只是我的想象? ;-)
      • yyyy-MM-ddThh:mm:ss"
      【解决方案5】:

      经过一些故障排除后,我终于解决了问题以及日期格式。为此,我需要将本地机器的时区与服务器的时区匹配。

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

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

      【讨论】:

      • 您只需要确保您指定的时间在服务器的时区内。一种方法是将您的本地计算机设置为与服务器相同的时区,但肯定还有其他方法(例如,做一些简单的时区计算)不需要您更改计算机设置。
      • yyyy-MM-ddTHH:mm:ss"
      猜你喜欢
      • 1970-01-01
      • 2013-03-30
      • 2013-07-07
      • 1970-01-01
      • 2020-12-16
      • 2019-12-31
      • 1970-01-01
      • 1970-01-01
      • 2019-03-23
      相关资源
      最近更新 更多