如何在EPiServer 8中显示计算属性值?

时间:2015-03-13 11:09:09

标签: episerver

在页面编辑模式下,我想显示基于页面属性值的只读文本。例如,文本可以是"内容审核提醒电子邮件将发送到2015-10-10",其中日期基于页面发布日期+六个月(可配置的值,因此可以随时改变)。到目前为止,我已经尝试通过在页面上添加另一个属性来完成这样的事情。

我已将属性 CurrentReviewReminderDate 添加到我们使用的 InformationPage 类中。在页面编辑模式下,将显示属性名称,但它没有值。如何在页面编辑模式下显示值(最好是标签)?

[CultureSpecific]
[Display(
    Name = "Review reminder date",
    Description = "On this date a reminder will be sent to the selected mail to remember to verify page content",
    Order = 110)]
[Editable(false)]
public virtual string CurrentReviewReminderDate
{
    get
    {
        var daysUntilFirstLevelReminder =
            int.Parse(WebConfigurationManager.AppSettings["PageReviewReminder_DaysUntilFirstLevelReminder"]);
        if (CheckPublishedStatus(PagePublishedStatus.Published))
        {
            return StartPublish.AddDays(daysUntilFirstLevelReminder).ToString();
        }
        return "";
    }
    set
    {
        this.SetPropertyValue(p => p.CurrentReviewReminderDate, value);
    }
}

2 个答案:

答案 0 :(得分:2)

EPiServer在检索UI内容时,内部使用 GetPropertyValue 方法(即与 SetPropertyValue 相反)。

这是有道理的,否则你的"化妆"每当保存内容时,值将被存储为实际值。 这会使后备值等无法实现

所以,这是EPiServer中的设计(非常明智)。 :)

但是,您可以通过以下方式自定义属性的工作方式:

  1. 通过应用UI提示使用自定义编辑器
  2. 修改属性元数据(例如,将生成的值显示为文本框中的水印,而不会干扰正在保存的实际值)
  3. 我可能会误解你正在尝试做的事情,但是在我的头脑中,看起来自定义编辑器对于你的用例来说可能是一个可行的选择?

答案 1 :(得分:1)

另一个解决方案是挂钩 LoadedPage -event并从那里添加值。这可能不是性能方面的最佳方式,因为您需要执行CreateWritableClone,但根据站点可能无关紧要。

    [InitializableModule]
[ModuleDependency(typeof(EPiServer.Web.InitializationModule))]
public class EventInitialization : IInitializableModule
{
    public void Initialize(InitializationEngine context)
    {
        ServiceLocator.Current.GetInstance<IContentEvents>().LoadedContent += eventRegistry_LoadedContent;
    }

    void eventRegistry_LoadedContent(object sender, ContentEventArgs e)
    {
        var p = e.Content as EventPage;
        if (p != null)
        {
            p = p.CreateWritableClone() as EventPage;
            p.EventDate = p.StartPublish.AddDays(10);
            e.Content = p;
        }
    }
}