gpt4 book ai didi

asp.net-mvc - MVCSiteMapProvider 面包屑不正确的父节点 ID

转载 作者:行者123 更新时间:2023-12-03 19:25:41 29 4
gpt4 key购买 nike

我有这个站点地图:

<mvcSiteMapNode title="Projects" controller="Projects" action="Index" key="Home" visibility="!*">
<mvcSiteMapNode title="Projects" controller="Projects" action="Index">
<mvcSiteMapNode title="Project" controller="Projects" action="Details" preservedRouteParameters="id">
<mvcSiteMapNode title="Session" controller="Sessions" action="Details" preservedRouteParameters="id">
<mvcSiteMapNode title="Edit Session" controller="Sessions" action="Edit" preservedRouteParameters="id"/>
</mvcSiteMapNode>
</mvcSiteMapNode>
</mvcSiteMapNode>
<mvcSiteMapNode title="My Account" controller="Account" action="ChangePassword" />
<mvcSiteMapNode title="Admin" controller="Admin" action="Index" >
<mvcSiteMapNode title="Create User" controller="Admin" action="AddUser" />
<mvcSiteMapNode title="Manage Users" controller="Admin" action="Users" />
</mvcSiteMapNode>

当我转到 session 详细信息页面时,面包屑显示:

Projects > Project > Session

但是转到“项目详细信息”页面的项目链接使用与 session 相同的 ID,而不是它来自的项目。

我尝试将 inheritedRouteParameters="id" 添加到 Session Details 页面,但没有任何改变。

编辑:我添加了不同的 preservedRouteParameters,但现在“项目”链接回/Projects/Details 而没有附加 id。

最佳答案

如果键名匹配,preservedRouteParameters 总是从当前请求复制值,它不假设“id”是什么。因此,如果在同时显示的2个节点的preservedRouteParameters中使用“id”,则需要确保它们具有相同的含义。

解决此问题的一种方法是为每种情况使用不同的键名称(例如,“projectId”和“sessionId”)。然后您可以将两者都保留在子节点上,以便它“记住”它属于哪个父节点。

<mvcSiteMapNode title="Project" controller="Projects" action="Details" preservedRouteParameters="projectId">
<mvcSiteMapNode title="Session" controller="Sessions" action="Details" preservedRouteParameters="projectId,sessionId">

您可能需要修改您的路由以生成满足您的要求的 URL,但要使其正常工作,父 ID 必须是子节点路由(通常是 URL)的一部分。这是一个匹配上述节点配置的示例。

public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

routes.MapRoute(
name: "SessionRoute",
url: "Project/{projectId}/{sessionId}",
defaults: new { controller = "Sessions", action = "Details" });

routes.MapRoute(
name: "ProjectRoute",
url: "Project/{projectId}",
defaults: new { controller = "Projects", action = "Details" });

routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
}

查看 MvcSiteMapProvider-Forcing-A-Match-2-Levels 项目 in this demo看看究竟如何做到这一点。请注意,添加路由是可选的 - 如果您不介意 URL 中的查询字符串参数,您始终可以使用默认路由。

如果这不适合您,那么您可以将在一个节点参数上使用 preservedRouteParmeters 与显式设置另一个参数相结合。

<mvcSiteMapNode title="Project" controller="Projects" action="Details" preservedRouteParameters="projectId">
<mvcSiteMapNode title="Session" controller="Sessions" action="Details" id="1" preservedRouteParameters="projectId">
<mvcSiteMapNode title="Session" controller="Sessions" action="Details" id="2" preservedRouteParameters="projectId">
<mvcSiteMapNode title="Session" controller="Sessions" action="Details" id="3" preservedRouteParameters="projectId">

或者您可以为您拥有的每个“id”组合创建一个节点。

<mvcSiteMapNode title="Project" controller="Projects" action="Details" id="1">
<mvcSiteMapNode title="Session" controller="Sessions" action="Details" id="1">
<mvcSiteMapNode title="Session" controller="Sessions" action="Details" id="2">
<mvcSiteMapNode title="Session" controller="Sessions" action="Details" id="3">
</mvcSiteMapNode>
<mvcSiteMapNode title="Project" controller="Projects" action="Details" id="2">
<mvcSiteMapNode title="Session" controller="Sessions" action="Details" id="4">
<mvcSiteMapNode title="Session" controller="Sessions" action="Details" id="5">
<mvcSiteMapNode title="Session" controller="Sessions" action="Details" id="6">
</mvcSiteMapNode>

对于最后两个选项,通常最好使用 DynamicNodeProvider填充动态数据而不是用 XML 标记它们。

这些方法可以创建更简洁的 URL,但也会占用更多的 RAM。通常对于管理页面,最好使用稍微草率的 URL (preservedRouteParmaters),并为需要搜索引擎索引的页面使用动态节点(和 RAM)来保存。

inheritedRouteParameters仅用于从XML配置中的父节点继承值,并且在请求级别没有作用。

顺便说一句 - 您必须确保每个节点上的路由值组合都是唯一的。在您的示例中,前 2 个节点具有完全相同的路由值,这意味着第二个节点永远不会匹配,因为第一个匹配总是获胜。

关于asp.net-mvc - MVCSiteMapProvider 面包屑不正确的父节点 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21940001/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com