Umbraco挂钩加载文档

时间:2013-07-26 07:44:12

标签: c# umbraco

我正在为umbraco编写自定义属性来计算文档的点击量。

有什么方法可以在加载文档时如何将我的逻辑连接到页面?

示例: 我有结构:

  1. 主页
    • 关于我
  2. 两者都有我的自定义属性。

    我想记录它们何时被加载。

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

3 个答案:

答案 0 :(得分:0)

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

如果之前未记录任何匹配,页面上的点击会创建新记录,或者会增加现有记录的计数。

您需要确保每页都记录了匹配,因此将其录制在您的基座Masterpage或基座Controller中将是我的方法。

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

使用单独的表允许您将内容分成单独的DLL,因为您不需要依赖于Umbraco API,因为您可以使用像PetaPoco或基本ADO这样的ORM。

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

答案 1 :(得分:0)

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

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

Thnx考虑我的问题。

答案 2 :(得分:-1)

如果要将此数据保存在Umbraco后端,则需要创建一个usercontrol并将该控件嵌入到母版页(top masterpage)中; 在usercontrol中添加以下用法:

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这是在没有测试的情况下编写的......仅仅是我的头脑