我正在为umbraco编写自定义属性来计算文档的点击量。
有什么方法可以在加载文档时如何将我的逻辑连接到页面?
示例: 我有结构:
两者都有我的自定义属性。
我想记录它们何时被加载。
注意:我不想在页面上使用任何javascript或操作。我想将它作为一个自定义DLL。
答案 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这是在没有测试的情况下编写的......仅仅是我的头脑