我正在创建一个Web项目,管理员可以在其中为特定的新用户创建内容项。所以我希望用户只能看到管理员指定的内容。
因此,每当用户登录时,只会看到管理员指定的内容(菜单,布局..)。
我试图实现这一目标的方式是:
- 管理员将内容项的所有者设置为目标用户。
使用IAuthorizationServiceEventHandler
我使用当前userId指定内容
无论如何都要通过userId获取内容?或者还有其他好的方法吗?
答案 0 :(得分:1)
如果您想获取具有特定所有者的所有内容项,您可以执行以下操作:
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;
修改强>
我不确定您要做什么,但如果您想要一个网址根据用户返回不同的内容项,我建议创建一个带有检索操作方法的新控制器用户内容项并显示该项。您可以参考Orchard.Core.Contents.Controllers.ItemController.cs类,以获取如何从控制器呈现内容项的示例。
如果您有许多内容项需要为每个用户使用不同的版本进行渲染,则会更复杂一些。一个简单的解决方案可以是创建内容类型并附加名为UserContent的内容选择器字段。此内容类型将充当为用户呈现特定项目的主数据。管理员将创建子项,将所有者设置为指定用户,并将子项添加到主内容选择器字段(UserContent)。然后我们可以为UserContent写一个替代的显示形状(我知道,有点hacky,更好 - 但稍微多一些工作 - 方法是为ContentPickerField创建一个新的驱动程序。所以将一个名为Fields.ContentPicker-UserContent
的文件放入你的模块&# 39; s View文件夹,你可以在里面找到类似的内容:
@{
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>
}
用记事本写的代码所以可能无法编译......