如何获取正在使用视图的页面列表?

How can I get a list of pages where a View is in use?

我有一个使用内容应用程序的大型网站,我们有各种各样的视图。在测试和开发中,我们越来越需要知道视图正在使用哪些页面。正如我所说,该网站很大,超过 500 页,要知道视图在哪个页面上使用是不可能的。

在 2sxc 中有什么方法可以解决这个问题吗?我不知道的功能?调试?见解?我愿意在视图中用代码来完成。我以为可以通过部分解决...

if(IsSuperUser(Dnn.User)) {
  @RenderPage("_Debug_ListPagesUsingThisView.cshtml")
}

我不知道如何或从哪里开始。有没有办法从视图中获取视图的实体(记录)?一旦我有了它,是否有路径可以进入应用程序的模块设置?告诉应用程序使用什么视图的信息实际存储在哪里?我可以去吗?


添加 从下面的评论链继续...

我无法进一步了解,我从 foreach(... .Parents()) 返回的实体具有以下字段:Template、Content、Presentation、ListContent 和 ListPresentation ...但是我无法弄清楚如何从中获取任何数据或字段。尽管 myEntity.Content.Count(和 .Template.)显示 1,但任何试图访问它的尝试都超出了 GetType()(它是一个动态实体列表)returns a无效的。这看起来很奇怪。

你知道实体类型到底是什么以及如何使用它吗?有趣的是,.Parents() returns 中的项目数与为此视图分配的 Content-Type 中的项目数相同,但是当我查看 (SQL) 数据时,它们是与实际内容不同的 EntityId(例如,如果我跟踪父 EntityId 3344,我发现附近的 EntityId 3343 是此视图在某处显示的 Content-Type 记录之一)。所以这是一个有趣的线索。想法?

这是我们永远的愿望清单:)。到目前为止,我们还没有找到执行此操作的资源。最好的起点是阅读数据是如何从

映射的

利用这些知识,您可以assemble 获得所需的数据。恐怕这将花费您至少 1/2 天的工作时间。

好的,我终于创建了自己的代码 - 是的,这很难!!!我至少花了 5 个小时才让一切正常工作 - 你欠我很多啤酒 ;)

我在杂项部分将其作为 DNN 教程的一部分:

https://2sxc.org/dnn-tutorials/en/razor/2sa110/page

玩得开心!

这里是我需要编写的代码的摘录 - 很多 LINQ


  // create a map of all blocks to DNN modules
  var block2ModuleMap = contentBlocks.GroupJoin(allMods, 
    cb => cb.EntityGuid,
    m => TryParseGuid(m.ModuleSettings[SettingsCG]),
    (cb, m) => new { 
      Block = cb, 
      Modules = m 
    }
  );

  // now map all the template-IDs to the block-module map
  var template2BlockModuleMap = block2ModuleMap.GroupBy(b2m => {
    var templates = AsList(b2m.Block.Template as object);
    return templates.Any() ? templates.First().EntityGuid : null;
  });

  var viewsWithBlocks = views.GroupJoin(template2BlockModuleMap,
    v => v.EntityGuid,
    bwm => bwm.Key,
    (v, bwm) => {
      var blockWithMod = bwm.SingleOrDefault();
      return new { 
        View = v, 
        Blocks = blockWithMod,
        ModsCount = blockWithMod != null ? blockWithMod.SelectMany(bmlist => bmlist.Modules).Count() : 0,
      };
    }
  );