Umbraco 7 - 如何从IPublishedContent获取发布日期?

时间:2014-01-05 23:45:30

标签: c# asp.net-mvc-4 content-management-system umbraco

我无法找到公布日期。我使用Umbraco.Core.Models.IPublishedContent接口,它似乎没有发布日期,只有创建和更新日期。

我在interwebs上找到的所有文档,建议使用Document(id),然后使用Document.ReleasedDate,但现在已经过时了。它建议在Umbraco.Core.Models.Content类中使用ReleaseDate。

我错过了什么?

4 个答案:

答案 0 :(得分:4)

在IPublishedContent上使用UpdateDate。发布内容时,该日期始终会更新。

您提到的ReleaseDate用于设置特定内容项应在何时发布(自动)的未来日期和时间。所以这不是你追求的日期。设置发布日期后,一旦项目发布,UpdateDate也将使用此日期进行更新。

答案 1 :(得分:2)

Umbraco内容项目没有内置属性来指示它们何时首次发布。

如果您想要可靠地指示实际发布内容的时间,最好的选择是在文档类型中添加自定义属性。然后,您可以向应用程序添加事件处理程序,该属性处理程序将属性更新为首次发布时的当前日期:

using System;
using System.Linq;
using Umbraco.Core;
using Umbraco.Core.Services;

namespace YourNamespace
{
    /// <summary>
    /// Updates the publishedDate property when content is first published
    /// </summary>
    public class UpdatePublishDateEventHandler : ApplicationEventHandler
    {
        protected override void ApplicationInitialized(UmbracoApplicationBase umbracoApplication, ApplicationContext applicationContext)
        {
            ContentService.Published += ContentService_Published;
        }

        void ContentService_Published(Umbraco.Core.Publishing.IPublishingStrategy sender, Umbraco.Core.Events.PublishEventArgs<Umbraco.Core.Models.IContent> e)
        {
            const string publishedDateKey = "publishedDate";
            var contentService = ApplicationContext.Current.Services.ContentService;
            foreach (var content in e.PublishedEntities.Where(x => x.HasProperty(publishedDateKey)))
            {
                var existingValue = content.GetValue(publishedDateKey);
                if (existingValue == null)
                {
                    content.SetValue(publishedDateKey, DateTime.Now);
                    contentService.SaveAndPublishWithStatus(content, raiseEvents: false);
                }
            }
        }
    }
}

Umbraco会在启动时自动扫描并激活从ApplicationEventHandler继承的类,因此您只需将上述类添加到项目中即可。

答案 2 :(得分:1)

如果您使用的是Umbraco 7,请查看Umbraco.Core.Models.IContent接口上的 ReleaseDate 属性。显然它“获取或设置内容应该被释放的日期,从而被发布”。

答案 3 :(得分:-1)

我认为您应该使用“.Created”日期。这将是文章最初发布的日期。

或者,您可以在DocType上使用自定义DateTime属性,并通过如下检索将其用作发布日期:

YourNodeObject.GetPropertyValue<DateTime>("customPropertyAliasHere");

此致