【问题标题】:ASP.NET MVC SiteMap provider doesn't generate sitemap nodes from attributesASP.NET MVC SiteMap 提供程序不会从属性生成站点地图节点
【发布时间】:2012-04-25 07:18:06
【问题描述】:

更新: 尽管有以下所有文本,但问题相当小 - 站点地图配置中的 includeAssembliesForScan 参数中的程序集名称错误。它不应包含“.dll”部分。

我有 v. 3.2.2.0 的 MvcSiteMapProvider。

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>

【问题讨论】:

  • 我刚刚遇到了类似的问题。你能告诉我你的标准命名空间和你的程序集名称是什么样的吗?在我的应用程序中,它们不匹配,这就是 MvcSiteMap 认为它会在区域内导致错误的 Url 生成的原因。
  • 我有相同的命名空间名称和程序集名称。但是 mvcSiteMapNode 标题的资源位于 Resources 命名空间中(实际上是 App_GlobalResources 项目文件夹)。
  • 我的 ASP.NET MVC 应用程序中没有区域。
  • 如果我创建一个区域并将我以前的所有站点内容放入其中,然后在所有 MVC SiteMap 提供程序部分(站点地图、操作属性等)中指示此区域名称,是否会有所帮助? .. 但我认为仅仅让 MVC SiteMap 提供程序工作太复杂了。

标签: asp.net-mvc nodes mvcsitemapprovider


【解决方案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>

【讨论】:

  • 我有 MvcSiteMapProvider 的 v. 3.2.2.0。除了程序集名称之外,我的 web.config 的“siteMap”部分也与您的相同(我更新了我的问题以将我的 siteMap 配置放在那里)。我的控制器与我的站点位于同一个程序集中。但同样,未在 mvc.sitemap 文件中明确定义的节点不会生成为节点。换句话说,MvcSiteMapNodeAttribute 属性不起作用。我尝试将 MvcSiteMapProvider 更新到 v.4 - 也许它会工作。
  • 您的程序集名称不应包含扩展名“.dll”。它必须与“应用程序”选项卡上项目属性中配置为“程序集名称”字段的内容相同。
  • 我修复了程序集名称。但是出现了另一个问题——至少根节点必须在mvc.sitemap文件中定义,因为属性化的动作方法只是没有ParentKey属性的参数不被识别为根节点。如何定义只有属性 MvcSiteMapNodeAttribute 的根节点 - 最少需要哪些参数?
  • 此外,我只使用 Title 和 Key 作为我假定的根节点(所有其他节点的父节点),但这似乎还不够。
  • 默认情况下,必须在 .sitemap 文件中定义根节点。在 v4 中,您可以使用 MvcSiteMapProvider_IncludeRootNodeFromSiteMapFile="false" 指定忽略根节点。如果您不打算使用 XML 来配置您的 SiteMap,请设置 MvcSiteMapProvider_EnableSiteMapFile="false"。据我所知,v3 没有办法在没有 XML 根节点的情况下对其进行配置,但这是唯一需要存在的节点。
猜你喜欢
  • 2011-08-21
  • 1970-01-01
  • 1970-01-01
  • 2023-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-21
  • 2010-09-06
相关资源
最近更新 更多