Umbraco 7隐藏导航节点用户无权访问

dar*_*ixx 3 razor umbraco7

我在Umbraco的先前版本中看到了一些例子(即5),这似乎相对简单.例如,请参阅此stackoverflow问题.

理论上,我可以在选择要使用的节点时使用属性HasAccessIsProtected节点,或方法WhereHasAccess.

我到目前为止的代码是:

var nodes = @CurrentPage.AncestorsOrSelf(1).First().Children;
Run Code Online (Sandbox Code Playgroud)

这让我得到了页面列表,没问题.但是,我正在努力过滤页面列表,以便登录用户只能看到他们有权访问的内容,并且公共访问者看不到受保护的页面.

V5代码表明这是可能的:

var nodes = @CurrentPage.AncestorsOrSelf(1).First().Children.WhereCanAccess();

但这会导致错误:

'Umbraco.Web.Models.DynamicPublishedContentList' does not contain a definition for 'WhereCanAccess'

在最新发布的版本剃须刀的cheatsheet为一把umbraco表明,HasAccess()IsProtected()有两种方法都可用,但使用这两种,当我得到空值,例如:

@foreach(var node in nodes.WhereCanAccess()) {
    <li>@node.Name / @node.IsProtected / @node.IsProtected() / @node.HasAccess() / @node.HasAccess </li>
}
Run Code Online (Sandbox Code Playgroud)

对所有测试值(例如@node.IsProtected)返回null .

似乎我想要实现的目标很简单,但我正以错误的方式接近它.有人请指出我的方式的错误!

小智 9

我检查用户对这样的页面的访问权限:

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);
Run Code Online (Sandbox Code Playgroud)

我的顶级菜单代码:

   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]
        }
}
Run Code Online (Sandbox Code Playgroud)

这将隐藏受保护的项目,除非用户已登录并具有访问权限.