我正在为 umbraco 编写自定义属性,用于计算文档的点击次数。
有什么办法可以在加载文档时将我的逻辑连接到页面?
示例: 我有结构:
- 家
- 关于我
两者都有我的自定义属性。
我想记录它们何时加载。
注意:我不想在页面上使用任何 javascript 或操作。我想将它作为一个自定义 DLL。
一种方法是有一个单独的数据库表,专门用于页面点击,例如[PageHit]
,它有两列[NodeId]
和[HitCount]
.
如果之前没有记录任何点击,则页面上的点击会创建新记录,或者会增加现有记录的计数。
您需要确保每页记录点击,因此将其记录在您的基地Masterpage
或基地Controller
中将是我的方法。
然后,您可以拥有一个基于自定义数据类型的属性,该数据类型查找该属性所在的特定节点的命中计数。自定义数据类型可以是用户控件,并且由于在 Umbraco 后台中,当您在内容编辑器中加载节点时,节点的 ID 在 URL 的查询中,您可以在用户控件中访问它以查询数据库。
使用单独的表也允许您将事物分离到单独的 DLL 中,因为您不需要依赖 Umbraco API,因为您可以使用像 PetaPoco 或基本 ADO 这样的 ORM。
我当然不会直接写回节点本身,因为这会导致数据库不必要的负载,从而导致站点页面加载的延迟,并且通常会减慢速度。
我选择的解决方案是:使用 IHttpModule 因为 umbraco 没有任何可用于此的事件。
至于配置:我决定在应用程序启动后动态连接我的模块。
谢谢大家考虑我的问题。
如果您想将此数据保存在 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这是未经测试写的..只是我的头顶