2012-04-25 72 views
0

更新站点地图结点:尽管下面的所有文字,问题是相当小 - 在地图的配置参数includeAssembliesForScan错误的程序集名称。它不应该包含“.dll”部分。ASP.NET MVC网站地图提供商不会产生从属性

我有MvcSiteMapProvider v.3.2.2.0。

如描述here,我使用属性来定义代码中的站点地图节点。但归因的操作不会生成为节点。仅生成在站点地图中明确定义的节点。

这是我的代码:

网站地图:

<?xml version="1.0" encoding="utf-8" ?> 
<mvcSiteMap xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xmlns="http://mvcsitemap.codeplex.com/schemas/MvcSiteMap-File-3.0" 
      xsi:schemaLocation="http://mvcsitemap.codeplex.com/schemas/MvcSiteMap-File-3.0 MvcSiteMapSchema.xsd" 
      enableLocalization="true"> 

    <mvcSiteMapNode 
     title="$resources:Mvc.sitemap,MainMenuTop_Main" 
     controller="Home" 
     action="Index" 
     key="Home">  

    <mvcSiteMapNode 
      title="$resources:Mvc.sitemap,Account" 
      controller="Account" 
      action="LogOn" 
      clickable="false" 
      key="Account" /> 

    </mvcSiteMapNode> 

</mvcSiteMap> 

家居控制器:

[HttpGet] 
[MvcSiteMapProvider.MvcSiteMapNode(
    ParentKey = "Home", 
    Title = "$resources:Mvc.sitemap,MainMenuTop_About")] 
public ActionResult About() 
{ 
    return View(); 
} 

帐户控制:

[HttpGet] 
[MvcSiteMapProvider.MvcSiteMapNode(
    ParentKey = "Account", 
    Title = "$resources:Mvc.sitemap,Register")] 
public ActionResult Register() 
{ 
    return View(); 
} 

所以,这两个动作不会成为站点地图中的节点。换句话说,MvcSiteMapNodeAttribute属性不起作用。为什么?

我的web.config中的部分地图。

<siteMap defaultProvider="MvcSiteMapProvider" enabled="true"> 
    <providers> 
    <clear/> 
    <add 
     name="MvcSiteMapProvider" 
     type="MvcSiteMapProvider.DefaultSiteMapProvider, MvcSiteMapProvider" 
     siteMapFile="~/Mvc.Sitemap" 
     securityTrimmingEnabled="true" 
     cacheDuration="5" 
     enableLocalization="true" 
     scanAssembliesForSiteMapNodes="true" 
     includeAssembliesForScan="Site2.dll" 
     excludeAssembliesForScan="" 
     attributesToIgnore="visibility" 
     nodeKeyGenerator="MvcSiteMapProvider.DefaultNodeKeyGenerator, MvcSiteMapProvider" 
     controllerTypeResolver="MvcSiteMapProvider.DefaultControllerTypeResolver, MvcSiteMapProvider" 
     actionMethodParameterResolver="MvcSiteMapProvider.DefaultActionMethodParameterResolver, MvcSiteMapProvider" 
     aclModule="MvcSiteMapProvider.DefaultAclModule, MvcSiteMapProvider" 
     siteMapNodeUrlResolver="MvcSiteMapProvider.DefaultSiteMapNodeUrlResolver, MvcSiteMapProvider" 
     siteMapNodeVisibilityProvider="MvcSiteMapProvider.DefaultSiteMapNodeVisibilityProvider, MvcSiteMapProvider" 
     siteMapProviderEventHandler="MvcSiteMapProvider.DefaultSiteMapProviderEventHandler, MvcSiteMapProvider"/> 
    </providers> 
</siteMap> 
+0

我只是有一个类似的问题。你能告诉我你的标准命名空间和你的程序集名称是怎样的吗? 在我的应用程序中,它们不匹配,这就是MvcSiteMap认为它将在Area内导致Url生成错误的原因。 – hydr 2012-05-04 14:51:17

+0

我有相同的名称空间名称和程序集名称。但是mvcSiteMapNode标题的资源位于Resources命名空间中(实际上它是App_GlobalResources项目文件夹)。 – user808128 2012-05-16 12:09:10

+0

我的ASP.NET MVC应用程序中没有区域。 – user808128 2012-05-16 12:15:18

回答

1

你需要确保你指定扫描站点地图节点配置,也提供你的控制器驻留在程序集名称注意你只需要给出程序集的名称,而不是它的路径。程序集必须从您的项目中引用。

请注意,在v4中,您的MVC项目现在由NuGet包自动注册,但是如果您将控制器置于另一个程序集中,则需要将控制器程序集添加到列表中(用逗号分隔)。

MvcSiteMapProvider V4(内部DI):

<!-- web.config --> 
<appSettings> 
    <add key="MvcSiteMapProvider_ScanAssembliesForSiteMapNodes" value="true" /> 
    <add key="MvcSiteMapProvider_IncludeAssembliesForScan" value="MyAssemblyName" /> 
</appSettings> 

MvcSiteMapProvider V4(外部DI):

// DI Module (file name varies depending on DI container) 
string[] includeAssembliesForScan = new string[] { "MyAssemblyName" }; 

你还需要确保ReflectionSiteMapNodeProvider在配置被注册。

MvcSiteMapProvider V3:

<siteMap defaultProvider="MvcSiteMapProvider" enabled="true"> 
    <providers> 
     <clear/> 
     <add name="MvcSiteMapProvider" 
      type="MvcSiteMapProvider.DefaultSiteMapProvider, MvcSiteMapProvider" 
      siteMapFile="~/Mvc.Sitemap" 
      securityTrimmingEnabled="true" 
      cacheDuration="5" 
      enableLocalization="true" 
      scanAssembliesForSiteMapNodes="true" 
      excludeAssembliesForScan="" 
      includeAssembliesForScan="MyAssemblyName" 
      attributesToIgnore="visibility" 
      nodeKeyGenerator="MvcSiteMapProvider.DefaultNodeKeyGenerator, MvcSiteMapProvider" 
      controllerTypeResolver="MvcSiteMapProvider.DefaultControllerTypeResolver, MvcSiteMapProvider" 
      actionMethodParameterResolver="MvcSiteMapProvider.DefaultActionMethodParameterResolver, MvcSiteMapProvider" 
      aclModule="MvcSiteMapProvider.DefaultAclModule, MvcSiteMapProvider" 
      routeMethod="" 
      siteMapNodeUrlResolver="MvcSiteMapProvider.DefaultSiteMapNodeUrlResolver, MvcSiteMapProvider" 
      siteMapNodeVisibilityProvider="MvcSiteMapProvider.DefaultSiteMapNodeVisibilityProvider, MvcSiteMapProvider" 
      siteMapProviderEventHandler="MvcSiteMapProvider.DefaultSiteMapProviderEventHandler, MvcSiteMapProvider"/> 
    </providers> 
</siteMap> 
+0

我有MvcSiteMapProvider v。3.2.2.0。除了程序集名称(我更新我的问题以便将我的siteMap配置存在)之外,我还拥有与您的web.config相同的“siteMap”部分。我的控制器驻留在与我的站点相同的程序集中。但是,在mvc.sitemap文件中没有明确定义的点也不会生成为点。换句话说,MvcSiteMapNodeAttribute属性不起作用。我尝试将MvcSiteMapProvider更新到v.4 - 也许它会起作用。 – user808128 2013-11-28 12:52:00

+1

您的程序集名称不应包含“.dll”文件的内容。它必须与“应用程序”选项卡上项目属性中“组件名称”字段的组态相同。 – NightOwl888 2013-11-28 14:10:19

+0

我修复了程序集名称。但是还会出现另一个问题 - 至少根节点必须在mvc.sitemap文件中定义,因为没有ParentKey参数的attribute操作方法被认为是根节点。如何定义只有属性MvcSiteMapNodeAttribute的根节点 - 哪些参数是最低要求? – user808128 2013-11-29 10:00:45