Umbraco挂钩以加载文档

本文关键字:加载 文档 Umbraco | 更新日期: 2023-09-27 18:25:04

我正在为umbraco编写自定义属性,该属性统计文档上的命中率。

当文档加载时,有什么方法可以将逻辑连接到页面上吗?

示例:我有结构:

  1. 主页
    • 关于我

两者都有我的自定义属性。

我想记录它们何时加载。

注意:我不想在页面上使用任何javascript或操作。我想把它作为一个自定义DLL。

Umbraco挂钩以加载文档

我选择的解决方案是:使用IHttpModule,因为umbraco没有任何可用于此的事件。

关于配置:我决定在应用程序启动后动态连接我的模块。

谢谢你考虑我的问题。

一种方法是有一个单独的数据库表,专门用于页面点击,例如[PageHit],它有两列[NodeId][HitCount]

如果以前没有记录任何点击,页面上的点击会创建一个新记录,或者增加现有记录的计数。

您需要确保命中是按页面记录的,所以我的方法是将其记录在基本Masterpage或基本Controller中。

然后,您可以拥有一个基于自定义数据类型的属性,该属性查找该属性所在的特定节点的命中数。自定义数据类型可以是用户控件,因为在Umbraco后台,当您在内容编辑器中加载节点时,节点的ID在URL的查询中,所以您可以在用户控件中访问该ID来查询数据库。

使用单独的表也可以将事物分离到单独的DLL中,因为您不需要依赖Umbraco API,因为您可以使用像PetaPoco或基本ADO这样的ORM。

我当然不会直接写回节点本身,因为这会导致数据库上不必要的负载,导致网站页面加载延迟,通常会减慢速度。

如果您想将这些数据保留在Umbraco后端,您需要创建一个用户控件并将该控件嵌入母版页(顶部母版页);在用户控制中添加以下用法:

using umbraco.cms.businesslogic.web;
using umbraco.BusinessLogic;
using umbraco.presentation.nodeFactory;

还有一种类似的方法:

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!Page.IsPostBack) // don't want to count postbacks
        {
            Document nodeCount = new Document(Node.GetCurrent().Id);
            int Count = 0;
            try
            {
                Count = Convert.ToInt32(nodeCount.getProperty("hitCount").Value);
            }
            catch
            {
                Count = 0; // value == null, not set yet
            }
            nodeCount.getProperty("hitCount").Value = Count + 1;
            nodeCount.Save();
            nodeCount.Publish(new User(0));
            umbraco.library.UpdateDocumentCache(nodeCount.Id);
        }

PS这是在未经测试的情况下编写的。。就在我的头顶