如何让 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 种方式之一提供节点配置:
.sitemap
XML file
- MvcSiteMapNodeAttribute
- Dynamic Node Providers
- 实施
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" />
我想使用我的 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 种方式之一提供节点配置:
.sitemap
XML file- MvcSiteMapNodeAttribute
- Dynamic Node Providers
- 实施
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" />