4

在我正在处理的网站中,某些内容仅在达到某个日期后才会出现:

public bool IsActive
{
    get { return System.DateTime.Now >= this.IssueDate.DateTime; }
}

我想使用预览模式功能和体验栏来测试这段代码。但是,System.DateTime.Now无论预览模式如何,始终返回实际的当前日期。我该怎么写才能保证体验栏中设置的日期受到尊重,但在正常模式下页面仍然使用System.DateTime.Now

Sitecore 版本:6.4.1 修订版。110720

更新:我不能使用发布限制,因为此项目的子项需要在此项目出现在此逻辑控制的菜单中之前发布并可见。

4

5 回答 5

4

Sitecore 提供了一对属性来帮助解决这种情况:

    bool Sitecore.Configuration.State.Previewing
    DateTime Sitecore.Configuration.State.PreviewDate

如果预览模式打开,则该Sitecore.Configuration.State.Previewing属性为 true,否则为 false。该Sitecore.Configuration.State.PreviewDate属性返回Sitecore.Sites.SiteContext.DisplayDate,在预览模式下设置为体验栏中的日期。

这是我最终使用的代码:

    public bool IsActive
    {
        get
        {
            DateTime dateToUse;
            if (Sitecore.Configuration.State.Previewing)
            {
                dateToUse = Sitecore.Configuration.State.PreviewDate;
            }
            else
            {
                dateToUse = DateTime.Now;
            }
            return dateToUse >= this.IssueDate.DateTime;
        }
    }

它似乎工作正常,没有副作用。

于 2013-05-10T19:02:53.920 回答
1

处理此类问题的最佳方法是限制内容在特定日期之前发布。

在内容编辑器的“发布”选项卡上,单击“限制”按钮以限制何时可以发布内容。

如果您需要内容在特定日期和时间上线,您可以利用自动发布器模块来实现此目的。

于 2013-05-11T17:18:22.103 回答
1

您应该能够使用 WebEditUtil.GetCurrentDate() 获取所选日期。

如果您不想引用它,请检查 cookie “sc_date”。

于 2013-05-13T09:40:39.793 回答
1

我不认为单独使用 Sitecore.Configuration.State.PreviewDate 会导致任何问题,因为它总是返回 dateTime (发出请求的时间)。

编辑: 如果 AJAx 调用同一页面/代码 Sitecore.Configuration.State 将为空,因此请确保您处理它。

于 2015-07-28T00:05:50.587 回答
0

另一种方法是更新SystemTime.CurrentTime方法。在Global.asax.csApplication_BeginRequest,添加以下内容:

SystemTime.CurrentTime = () =>
                State.Previewing || State.WebEditing
                    ? State.PreviewDate
                    : DateTime.Now;

现在,无论您在哪里寻找DateTime.Now它都会返回正确的日期。

于 2017-08-23T15:29:39.140 回答