C# Umbraco连接到加载文档

C# Umbraco连接到加载文档,c#,umbraco,C#,Umbraco,我正在为umbraco编写自定义属性,该属性统计文档的点击次数 在加载文档时,有没有办法将我的逻辑连接到页面 示例: 我有以下结构: 家 关于我 两者都有我的专属财产 我想记录它们何时加载 注意:我不想在页面上使用任何javascript或操作。我希望将其作为一个自定义DLL。一种方法是专门为页面点击设置一个单独的db表,例如,[PageHit],它有两列[NodeId]和[HitCount] 如果以前没有记录任何点击,则页面上的点击会创建新记录,或者会增加现有记录的计数 您需要确保每页记录

我正在为umbraco编写自定义属性,该属性统计文档的点击次数

在加载文档时,有没有办法将我的逻辑连接到页面

示例: 我有以下结构:

    • 关于我
  • 两者都有我的专属财产

    我想记录它们何时加载


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

    一种方法是专门为页面点击设置一个单独的db表,例如,
    [PageHit]
    ,它有两列
    [NodeId]
    [HitCount]

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

    您需要确保每页记录点击,因此我的方法是在您的基本
    母版页
    或基本
    控制器
    中记录点击

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

    使用单独的表也可以将内容分离到单独的DLL中,因为您不需要依赖Umbraco API,因为您可以使用类似PetaPoco或basic ADO的ORM


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

    如果要将此数据保留在Umbraco后端,需要创建一个usercontrol并将该控件嵌入母版页(顶部母版页); 在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这是在没有测试的情况下编写的。。我选择的解决方案是: 使用IHttpModule,因为umbraco没有可用于此操作的任何事件

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


    谢谢你考虑我的问题。

    问题是我不想在我的页面中添加任何附加逻辑。我的想法是它应该是开箱即用的。在这种情况下,您可以使用与上面相同的逻辑创建一个HttpModule(并在web.config中注册)。模块是在每次请求时调用的程序集。编辑:我想知道您是否可以获取请求处理程序的当前上下文(例如Umbraco节点)。-1@Leon抱歉,在每个页面加载时保存和发布页面是一个糟糕的建议。请参阅我的答案,了解原因。@Digbyswift我知道这是一个糟糕的建议,也不是我可以考虑的解决方案,但由于TS希望将其作为一个属性,因此没有其他方法来确保更改保持不变。获取URL并将其发布到新表(或者我更喜欢的新数据库——将数据与CMS分开)是一个更好的解决方案。但这不是问题所在。当然,该属性可以是一个自定义usercontrolwrapper数据类型,它只使用节点id在db表上查找。请参阅我的答案,了解更多细节。这是我第一个在控制器上执行操作的想法。问题是我无法轻松插入,需要修改代码。实际上,使用控制器甚至全局过滤器可能更容易执行。这可以在继承自
    UmbracoApplication
    的自定义全局类中注册,并且可以检测
    ActionExecuting
    事件。由于我上面解释的原因,您不想做的一件事是直接保存到节点。不确定这是否可行,因为在HttpModule中,您不知道正在访问的节点的ID。同意@Digbyswift,您的模块中没有上下文,因此您应该记录访问的url,不是节点——就像他最初的回答一样。@Digbyswift我不需要上下文,我只需要url和uQuery。这将允许我获取节点ID的数据。使用标准的umbraco用户界面进行所需的数据访问。是的,您可以使用uQuery和URL,但这就像使用锤子敲开螺母一样。此外,这将引发间歇性异常,因为
    GetNodeByUrl()
    使用XML缓存,而只有在应用程序
    唤醒后才会立即可用。它也不会获取节点url别名,并且会为通过IIS传递的每个请求调用它。