0

我正在为 umbraco 编写自定义属性,用于计算文档的点击次数。

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

示例: 我有结构:

    • 关于我

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

我想记录它们何时加载。

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

4

3 回答 3

0

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

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

您需要确保每页记录点击,因此将其记录在您的基地Masterpage或基地Controller中将是我的方法。

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

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

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

于 2013-07-26T08:22:26.460 回答
0

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

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

谢谢大家考虑我的问题。

于 2013-07-26T14:36:20.190 回答
-1

如果您想将此数据保存在 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这是未经测试写的..只是我的头顶

于 2013-07-26T08:37:19.647 回答