我在之前版本的Umbraco(即5)中看到过一些例子,其中这似乎相对简单。参见这个stackoverflow问题。
理论是,我可以在节点上使用属性HasAccess
或IsProtected
,或者在选择使用哪些节点时使用方法WhereHasAccess
。
var nodes = @CurrentPage.AncestorsOrSelf(1).First().Children;
这可以让我得到页面列表,没问题。然而,我正在努力过滤页面列表,以便登录用户只看到他们有权访问的页面,而公共访问者看不到受保护的页面。
V5代码表明这是可能的:
var nodes = @CurrentPage.AncestorsOrSelf(1).First().Children.WhereCanAccess();
但是这会导致错误:
'Umbraco.Web.Models.DynamicPublishedContentList' does not contain a definition for 'WhereCanAccess'
最新发布的Razor Umbraco备查表表明,HasAccess()
和IsProtected()
是两个方法,都是可用的,但当使用其中任何一个时,我得到空值,例如:
@foreach(var node in nodes.WhereCanAccess()) {
<li>@node.Name / @node.IsProtected / @node.IsProtected() / @node.HasAccess() / @node.HasAccess </li>
}
为所有测试值返回null(例如@node.IsProtected
)。
我想要达到的目标似乎很简单,但我的方法是错误的。有人能指出我的错误吗?
我检查用户对页面的访问权限:
var node = [the page you want to verify access to ie. "CurrentPage"];
var isProtected = umbraco.library.IsProtected(node.id, node.path);
var hasAccess = umbraco.library.HasAccess(item.id, item.path);
顶部菜单代码:
var homePage = CurrentPage.AncestorsOrSelf(1).First();
var menuItems = homePage.Children.Where("UmbracoNaviHide == false");
@foreach (var item in menuItems)
{
var loginAcces = umbraco.library.IsProtected(item.id, item.path) && umbraco.library.HasAccess(item.id, item.path);
var cssClass = loginAcces ? "loginAcces ":"";
cssClass += CurrentPage.IsDescendantOrSelf(item) ? "current_page_item" :"";
if(!umbraco.library.IsProtected(item.id, item.path) || loginAcces){
[render your item here]
}
}
这将隐藏受保护的项,除非用户登录并具有访问权限。
感谢@user3815602,我是这样做的
创建一个扩展方法
namespace CPalm.Core
{
public static class ExtensionMethods
{
public static bool CurrentUserHasAccess(this IPublishedContent content)
{
int contentId = content.Id;
string contentPath = content.Path;
bool isProtected = umbraco.library.IsProtected(contentId, contentPath);
if (isProtected)
{
bool hasAccess = umbraco.library.HasAccess(contentId, contentPath);
if (!hasAccess)
return false;
}
return true;
}
}
}
可以这样使用
foreach (IPublishedContent content in CurrentPage.AncestorsOrSelf(1).First().Children)
{
if (!content.CurrentUserHasAccess())
continue;
/* The current user has access to the content */
}
我有另一种方法来实现它。
Model.Content.Children.Where(o => Umbraco.IsProtected(o.Id, o.Path)).Any()