Невозможно отобразить 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, поэтому пользователь не сможет перейти туда напрямую.
Изменение видимости ссылки ничего не гарантирует, но если это все, что вам нужно, вам следует обратиться к разделу, посвященному поставщику видимости, в документации.