如何让 MVCSiteMap 包含我所有的自定义路由

How do I get MVCSiteMap to include all my custom route

我想使用我的 C# 文件中定义的路由属性来创建 xml 站点地图 (MVCSiteMap) 文件,如下所示:

[RoutePrefix("{culture}/Registration/Person")]
public partial class PersonController : BaseController
{
   [HttpPost]
   [Route("Step1")]
   public ActionResult StartStep1() {}
}

并像这样创建一个 xml 文件:

 <mvcSiteMapNode title="Registration" controller="Person" action="Index" >
  <mvcSiteMapNode title="Registration Person" route="Step1" controller="Person" action="Index" />
</mvcSiteMapNode>

但是路由属性被忽略,结果是:

Additional information: A route named 'Step1' could not be found in the route collection.

我的web.config文件是这样配置的:

 <add key="MvcSiteMapProvider_IncludeRootNodeFromSiteMapFile" value="true" />
<add key="MvcSiteMapProvider_AttributesToIgnore" value="" />
<add key="MvcSiteMapProvider_CacheDuration" value="5" />
<add key="MvcSiteMapProvider_UseExternalDIContainer" value="false" />
<add key="MvcSiteMapProvider_ScanAssembliesForSiteMapNodes" value="true" />

I want to use the route attribute defined in my C# files for create the xml site map (MVCSiteMap) file

你不能。

节点的目的是定义不同控制器动作之间的父子关系。路由属性不提供执行此操作的方法,因此无法在 .sitemap 文件中自动包含路由的所有可能匹配项或定义层次结构。

您必须提供节点配置以填补 MVC 未提供的缺失部分。您可以通过以下 4 种方式之一提供节点配置:

  1. .sitemap XML file
  2. MvcSiteMapNodeAttribute
  3. Dynamic Node Providers
  4. 实施 ISiteMapNodeProvider 并使用外部 DI 注入您的实施(有关详细信息,请参阅 this answer

我认为与您想要的最相似的选项是使用MvcSiteMapNodeAttribute

[RoutePrefix("{culture}/Registration/Person")]
public partial class PersonController : BaseController
{
    // NOTE: This assumes you have defined a node on your 
    // Home/Index action with a key "HomeKey"
    [MvcSiteMapNode(Title = "Registration", 
        Key = "RegistrationKey", ParentKey = "HomeKey")]
    public ActionResult Index() {}

    [HttpPost]
    [Route("Step1")]
    [MvcSiteMapNode(Title = "Registration Person", 
        Key = "RegistrationPersonKey", ParentKey = "RegistrationKey")]
    public ActionResult StartStep1() {}
}

Additional information: A route named 'Step1' could not be found in the route collection.

route 属性是通过名称来标识注册的路由,而不是通过URL。因此,要使您的配置生效,您需要为您的路线命名。

[Route("Step1", Name = "TheRouteName")]

然后在您的节点配置中使用相同的名称。

<mvcSiteMapNode title="Registration Person" route="TheRouteName" controller="Person" action="Index" />