每个用户的果园内容

Orchard Content Per user

我正在制作一个网络项目,管理员可以在其中为特定的新用户创建内容项。所以我希望用户只能看到管理员指定的内容。

所以无论何时用户登录,都只会看到管理员指定的内容(菜单、布局..)。

我试图实现这一目标的方式是:

-管理员将内容项的所有者设置为目标用户。
-using IAuthorizationServiceEventHandler 我使用当前用户Id

指定内容

有没有办法通过 userId 获取内容?或者还有其他好的方法吗?

如果您想获取特定所有者的所有内容项,您可以执行以下操作:

var userId = ...; //
_contentManager.Query(VersionOptions.Published)
  .Where<CommonPartRecord>(cr => cr.OwnerId == userId)
  .List();

检查所有者的特定内容项:

var ownerId = contentItem.As<CommonPart>.Owner.Id;

注入IOrchardServices即可访问当前用户

var currentUserId = _orchardServices.WorkContext.CurrentUser.Id;

编辑:

我不确定您要做什么,但是如果您想要一个 url 到 return 不同的内容项目,我建议您创建一个新的控制器使用检索用户内容项并显示它的操作方法。您可以参考 Orchard.Core.Contents.Controllers.ItemController.cs class 以获取有关如何从控制器呈现内容项的示例。

如果您有许多内容项目需要为每个用户呈现不同的版本,那就有点复杂了。一个简单的解决方案可能是创建一个内容类型并附加一个名为 UserContent 的内容选择器字段。此内容类型将充当为用户呈现特定项目的母版。管理员将创建子项,将所有者设置为指定的用户并将子项添加到主内容选择器字段 (UserContent)。然后我们可以为 UserContent 编写一个替代显示形状(我知道有点 hacky,更好的 - 但稍微多一点工作 - 方法是为 ContentPickerField 创建一个新的驱动程序。所以将一个名为 Fields.ContentPicker-UserContent 的文件拖放到模块的视图中文件夹,您可以在其中包含以下内容:

@{
  var userId = WorkContext.CurrentUser.Id;
  var field = (ContentPickerField)Model.ContentField;
  var contentItem = field.ContentItems.FirstOrDefault(item => item.As<CommonPart>().Owner.Id == userId);
}

@if(contentItem != null) {
  <div>
    @Display(contentItem.ContentManager.BuildDisplay(contentItem, "Detail"))
  </div>
}

用记事本编写的代码可能无法编译...