Umbraco挂钩以加载文档
本文关键字:加载 文档 Umbraco | 更新日期: 2023-09-27 18:25:04
我正在为umbraco编写自定义属性,该属性统计文档上的命中率。
当文档加载时,有什么方法可以将逻辑连接到页面上吗?
示例:我有结构:
- 主页
-
- 关于我
两者都有我的自定义属性。
我想记录它们何时加载。
注意:我不想在页面上使用任何javascript或操作。我想把它作为一个自定义DLL。
我选择的解决方案是:使用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这是在未经测试的情况下编写的。。就在我的头顶