按用户和钩子过滤管理器中的页面列表

Posted

技术标签:

【中文标题】按用户和钩子过滤管理器中的页面列表【英文标题】:Filtering PageList in Manager by User & Hooks 【发布时间】:2015-03-13 08:50:57 【问题描述】:

我想让 Piranha CMS 管理器屏幕仅列出由登录用户创建的页面。我认为我应该使用 PageListModelLoaded 钩子来实现这一点,并在 global.asax 中编写了这段代码。

protected void Application_Start()

   AreaRegistration.RegisterAllAreas();
   RouteConfig.RegisterRoutes(RouteTable.Routes);
   Hooks.Manager.PageListModelLoaded += (controller, menu, model) =>
   
       Guid user_id =  controller.User.GetProfile().Id;
       model.Pages = model.Pages.Where(p => p.CreatedBy == user_id).ToList();     
   ;

不幸的是,这并没有按我的预期工作,即使我通过逐步调试看到 model.Pages 的计数为零,Manager 也会列出所有页面。如果有人帮我看看我的错在哪里,我将不胜感激。

问候, 提交

【问题讨论】:

【参考方案1】:

Piranha CMS的认证管理器使用FormsAuthentication,所以获取登录用户的用户id的正确方法是:

var user_id = new Guid(controller.User.Identity.Name);

最好的问候!

编辑 2015-01-16

好的,所以我仔细研究了您的问题。页面列表视图实际上通过其视图模型提供了两个集合。一个平面列表model.Pages 和一个分层集合model.SiteMap。您可以在此处查看渲染树结构的调用:

https://github.com/PiranhaCMS/Piranha/blob/2.2.4/Piranha/Areas/Manager/Views/Page/Index.cshtml#L178

这样做的原因是页面以树状结构(站点地图)显示,但是当您在搜索字段中键入内容时,会返回一个平面列表(页面)。为了过滤视图,您需要过滤这两个集合。

/哈坎

【讨论】:

感谢@HåkanEdling,但您获取 user_id 的代码返回的 guid 与我在问题中写的相同。返回的 guid 可能对或错,真正的问题是即使 where 条件返回的 model.pages 计数为 0,页面仍然在管理器中列出。 (我正在使用 PiranhaCmsMvc nuget 包附带的示例应用程序,在数据库中,只有一个由用户 guid ca19d4e7-92f0-42f6-926a-68413bbdafbc 创建的页面,登录用户的 guid 是 309d6b3a-26c7- 4cfb-a71e-6e1b83993960 并且仍然列出了一页) 感谢@HåkanEdling,您编辑的答案解决了我的问题。我什至尝试仅过滤 SiteMap 并删除页面过滤器,并看到输入正确的单词会导致过滤后的页面出现。也许这可以用作创建秘密页面的一种方式,只有拥有秘密单词并知道搜索它的用户才能看到秘密页面:)

以上是关于按用户和钩子过滤管理器中的页面列表的主要内容,如果未能解决你的问题,请参考以下文章

如何在URL筛选管理器中过滤不需要的URL

在 FAR 管理器中按日期对文件进行排序

资源管理器中的地址栏只能在浏览器中打开

如何在winXP中的任务管理器中隐藏程序?

从任务管理器中隐藏 Android 应用程序 [重复]

Sitecore 在用户管理器中编辑用户异常