I am using MVC SiteMap from codeplex , I've set sitemap to this
<mvcSiteMapNode title="LEADS" controller="Leads" action="DetailsLeads" Url="/Leads/DetailsLeads" roles="TEST">
<mvcSiteMapNode title="LEADS1" controller="Leads" action="ScheduleMettingLeads" Url="/Leads/ScheduleMettingLeads" roles="TEST"/>
<mvcSiteMapNode title="LEADS2" controller="Leads" action="ServiceAppealLeads" Url="/Leads/ServiceAppealLeads" roles="TEST"/>
</mvcSiteMapNode>
When I am setting securityTrimmingEnabled="true" , I am getting following Error:
Ambiguous controller. Found multiple controller types for LeadsController. Consider narrowing the places to search by adding you controller namespaces to ControllerBuilder.Current.DefaultNamespaces.
Area setup is quite tricky. Please see this issue for an explanation of how to set up areas with MvcSiteMapProvider.
https://github.com/maartenba/MvcSiteMapProvider/issues/78?source=cc#issuecomment-20918916
Related
I have two user types-
-Admin
-Visitor
If the user type is "Visitor" then the Sub1 node will not be there in the menu.But the below code doesn't work to hide/remove the specific node.
My Sitemap looks like:
<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>
From the Layout.cshtml I have called
#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"]="!*"; }
}}
The most common way to handle this is to use group-based security and use the AuthorizeAttribute.
However, in this simple scenario you don't even really need groups. Adding the AuthorizeAttribute to your action method will automatically deny any users that are not logged in.
[Authorize]
public ActionResult Sub1()
{
return View();
}
This assumes you have setup a security framework that implements IPrincipal and IIdentity (of which ASP.NET Identity and Membership both do). You can get the basic framework for one of these options by using one of the default templates created by Visual Studio and copying over the relevant bits (AccountController, ManageController, related views, and related startup code) into your project.
All that would be required in MvcSiteMapProvider would be to enable security trimming.
Internal DI (web.config)
<appSettings>
<add key="MvcSiteMapProvider_SecurityTrimmingEnabled" value="true"/>
</appSettings>
External DI (MvcSiteMapProvider Module)
bool securityTrimmingEnabled = true; // Near the top of the module
That will make the nodes automatically hide when the user doesn't have access and AuthorizeAttribute will actually secure the URL so the user can't navigate there directly.
Changing visibility of a link doesn't secure anything, but if that is all you want, you should refer to the visibility provider section of the documentation.
I have a web site using MvcSiteMapProvider for the main navigation. I have run into a scenario that I'm unable to figure out.
My site has the following navigation:
The site map looks like:
<?xml version="1.0" encoding="utf-8" ?>
<mvcSiteMap xmlns="http://mvcsitemap.codeplex.com/schemas/MvcSiteMap-File-3.0" enableLocalization="true">
<mvcSiteMapNode title="Look Up" controller="Lookup" action="Index">
<mvcSiteMapNode title="PackingList" controller="PackingList" action="Index">
<mvcSiteMapNode title="Configuration" controller="Configuration" action="Printers">
<mvcSiteMapNode title="Printers" controller="Configuration" action="Printers" />
<mvcSiteMapNode title="Quick List" controller="Configuration" action="QuickList" />
</mvcSiteMapNode>
</mvcSiteMapNode>
</mvcSiteMap>
I have not been able to figure out how to properly leverage the site map for the side tab navigation reliably. I also need to have the Configuration tab remain selected as well as the active side tab.
When two nodes have the same controller and action name, the SiteMapProvider cannot determine which node is active, and it always chooses the first matching node, in this case 'Configuration'.
The only way to make both nodes selected is:
Use a different action of the printers menu
Changed the display template to indicate the nodes in the current path with a CSS class or a like
I am using Asp.net MVC SiteMap Provider to manage the sitemap of my website.
Structure of Application:
It is a small application where I have an area called "Admin"
SiteMap
<mvcSiteMapNode title="LET'S GO" controller="Home" action="Index">
<mvcSiteMapNode title="FESTAS" controller="Festas" action="Index">
<mvcSiteMapNode title="INFANTIL" controller="Festas" action="Infantil" />
<mvcSiteMapNode title="ADULTO" controller="Festas" action="Adulto" />
</mvcSiteMapNode>
<mvcSiteMapNode title="ORÇAMENTO" controller="Home" action="Index" />
<mvcSiteMapNode title="CONTATO" controller="Home" action="Contato"/>
<mvcSiteMapNode title="ADMINISTRAÇÃO" area="Admin" controller="Home" action="Index">
<mvcSiteMapNode title="FESTAS" area="Admin" controller="Festas" action="Index" />
<mvcSiteMapNode title="SUBSIDIÁRIAS" area="Admin" controller="Subsidiarias" action="Index" />
</mvcSiteMapNode>
</mvcSiteMapNode>
Problem
To display the main menu, use the following command:
#Html.MvcSiteMap().Menu()
This is the first problem, all nodes are displayed.
I would like to display only the nodes roots ("INFANTIL" and "ADULTO" for example will not be displayed)
The nodes of the Admin area can not be displayed. They only appear on another view.
How can I accomplish these tasks?
Question
How can I generate a sitemap only a specific node?
Example: I want to generate the sitemap only child node of "ADMINISTRAÇÃO"
Thanks to everyone!!
1) I would like to display only the nodes roots ("INFANTIL" and "ADULTO" for example will not be displayed)
#Html.MvcSiteMap().Menu(1, 1)
2) The nodes of the Admin area can not be displayed. They only appear on another view.
May be you should use roles attribute.
Creating a first sitemap
How can I generate a sitemap only a specific node?
Try to use one of the overloaded method
public static System.Web.Mvc.MvcHtmlString Menu(this MvcSiteMapProvider.Web.Html.MvcSiteMapHtmlHelper helper, System.Web.SiteMapNode startingNode, bool startingNodeInChildLevel, bool showStartingNode, int maxDepth)
I know this question is bit outdated, but for future use:
this can easily be done by decorating the Actions (or Controller) with access permissions.
I assume that not everybody can access the administrative part (only the accredited). So you could create eg an Administrative Role and decorate with a FilterAttribute the Actions (or Controller): eg
[Authorize(Roles = "Administrator")]
public ActionResult Index()
{ .... }
Once the user has identified herself as an Administrator the sitemap entry for the Index Action will be shown.
I have a problem with my related and upsells.
When a customer login, my related and upsells not display in product_view.
The three most likely ways in which this can happen involve the following:
Layout XML
PHP/PHTML
CSS
Layout XML: grep your layout xml for <customer_logged_in> and see if there are any <remove /> nodes referring to these blocks. Also check for <action> tags with unsetChild method calls that refer to these blocks.
PHP/PHTML: It's possible that the templates and class definitions for these blocks have had logic added to them to check for customer logged in state. This would be an inefficient way to accomplish this, but it's possible. You'll need to check the templates (google for Magento template path hints) and the block classes in which they are rendered; see if they have been customized.
CSS: This is the most unlikely candidate, but I've seen developers set display:none based on <body> classes added via layout XML. This could be seen as an addBodyClass call in the <customer_logged_in> layout update handle, which I described how to find above.
This has been driving me crazy for the last couple of hours. I am using the MVC Sitemap Provider to add breadcrumb functionality.
Let me go through the steps of what I have done so I can make this as clear as possible
Downloaded the resource from Nuget
I then have the following in my sitemap
<?xml version="1.0" encoding="utf-8" ?>
<mvcSiteMapNode title="Vehicles" controller="Vehicles" area="Vehicles" action="Index">
<mvcSiteMapNode title="VehicleName" controller="Vehicles" area="Vehicles" action="Showroom" >
<mvcSiteMapNode title="Overview" area="Vehicles" controller="Vehicles" action="Overview" />
</mvcSiteMapNode>
</mvcSiteMapNode>
And I have this in my view
#Html.MvcSiteMap().SiteMapPath()
My first questions is: How can I have in replace "VehicleName" for action Showroom, with my actual VehicleName?
My actual problem is: My id is not persisted through to the parent. For example my url will be localhost:44357/Vehicles/Overview/Soul/1, and the parent url will be localhost:44357/Vehicles/Showroom, instead of localhost:44357/Vehicles/Showroom/Soul/1. The vehiclename in the url is optional, so the url can just be localhost:44357/Vehicles/Showroom/1.
I hope this makes sense
Thanks for your help.
For questions 1: Set the VehicleName on the parent node. For example: ((MvcSiteMapNode)SiteMap.CurrentNode.Parent).RouteValues.Add("VehicleName", "SomeVehicle");. A good option may also be to use dynamic node providers for creating your sitemap structure.
For question 2: [SiteMapPreserveRouteData] should do the trick