Невозможно отобразить HTML-узлы MvcSiteMap на основе пользовательских типов.

У меня есть два типа пользователей
-admin
-Visitor
Если тип пользователя "Посетитель", то узел Sub1 не будет там в меню. Но приведенный ниже код не работает, чтобы скрыть / удалить конкретный узел.
Мой файл Sitemap выглядит так:

<mvcSiteMapNode title="Home" controller="Home" action="Index">
<mvcSiteMapNode title="Site Map Test" controller="SitemapTest"action="Index" key="sitemaptestnode"> 
<mvcSiteMapNode title="Sub1" controller="SitemapTest" action="Sub1" key="Childsitemaptestnode1" visibility ="false"/>
<mvcSiteMapNode title="Sub2" controller="SitemapTest" action="Sub2" key="Childsitemaptestnode2"/>
<mvcSiteMapNode title="Sub3" controller="SitemapTest" action="Sub3" />
</mvcSiteMapNode>
</mvcSiteMapNode>

Из Layout.cshtml я позвонил

@Html.Action(“RenderMenu”,”Menu”);


Public void RenderMenu(){
var node = MvcSiteMapProvider.SiteMaps.Current.FindSiteMapNodeFromKey("Childsitemaptestnode1");
If (node.title =="Sub1"){
//Function to get the user type from database
String UserType=GetUserTypes();
If(UserType=="Visitor"){
//Hide Sub1 node from Menu
node.Attributes["visibility"]="!*";  }  
}}

1 ответ

Наиболее распространенный способ справиться с этим - использовать групповую безопасность и использовать AuthorizeAttribute.

Однако в этом простом сценарии вам даже не нужны группы. Добавление AuthorizeAttribute к вашему методу действия автоматически откажут любые пользователи, которые не вошли в систему.

    [Authorize]
    public ActionResult Sub1()
    {
        return View();
    }

Это предполагает, что у вас есть настроенная структура безопасности, которая реализует IPrincipal а также IIdentity (из которых удостоверение ASP.NET и членство оба делают). Вы можете получить базовую структуру для одного из этих параметров, используя один из шаблонов по умолчанию, созданных Visual Studio, и копируя соответствующие биты (AccountController, ManageController, связанные представления и связанный код запуска) в ваш проект.

Все что потребуется в MvcSiteMapProvider будет включать безопасность обрезки.

Внутренний DI (web.config)

<appSettings>
    <add key="MvcSiteMapProvider_SecurityTrimmingEnabled" value="true"/>
</appSettings>

Внешний DI (модуль MvcSiteMapProvider)

bool securityTrimmingEnabled = true; // Near the top of the module

Это заставит узлы автоматически скрываться, когда у пользователя нет доступа и AuthorizeAttribute будет фактически защищать URL, поэтому пользователь не сможет перейти туда напрямую.

Изменение видимости ссылки ничего не гарантирует, но если это все, что вам нужно, вам следует обратиться к разделу, посвященному поставщику видимости, в документации.

Другие вопросы по тегам