gpt4 book ai didi

asp.net-mvc-4 - MVC SiteMap - 当不同节点指向相同操作时 SiteMap.CurrentNode 未映射到正确的路线

转载 作者:行者123 更新时间:2023-12-02 20:45:28 26 4
gpt4 key购买 nike

设置:

我正在使用 ASP.NET MVC 4 和 mvcSiteMapProvider 来管理我的菜单。

我有一个自定义菜单生成器,用于评估节点是否位于当前分支上(即,如果 SiteMap.CurrentNode 是 CurrentNode 或 CurrentNode 嵌套在其下)。该代码包含在下面,但本质上是检查每个节点的 url,并将其与当前节点的 url 进行比较,直到当前节点“家谱”。

我的自定义菜单生成器使用 CurrentBranch 添加一个类,该类突出显示 CurrentBranch 上的菜单项。

问题:

我的自定义菜单工作正常,但我发现 mvcSiteMapProvider 似乎没有以一致的方式评估 CurrentNodeurl方式:

当两个节点指向同一个操作并且仅通过操作的参数来区分时,SiteMap.CurrentNode 似乎没有使用正确的路由(它忽略了区分参数并默认为第一个)映射到节点中定义的操作的路由)。

问题示例:

在一个应用程序中,我有成员

成员(member)有一个 MemberStatus 字段,可以是“未处理”、“事件”或“非事件”。为了更改 MemberStatus,我在名为 Admin 的区域中有一个 ProcessMemberController。处理是使用 ProcessMemberController 上的 Process 操作完成的。

我的 mvcSiteMap 有两个节点,它们都映射到 Process 操作。它们之间的唯一区别是 alternate 参数(例如我客户的域语义),在一种情况下其值为“已处理”,在另一种情况下为“未处理”:

节点:

    <mvcSiteMapNode title="Process" area="Admin" controller="ProcessMembers" action="Process" alternate="Unprocessed" />
<mvcSiteMapNode title="Change Status" area="Admin" controller="ProcessMembers" action="Process" alternate="Processed" />

路线:

到这两个节点的对应路由是(同样,唯一区分它们的是备用参数的值):

context.MapRoute(
"Process_New_Members",
"Admin/Unprocessed/Process/{MemberId}",
new { controller = "ProcessMembers",
action = "Process",
alternate="Unprocessed",
MemberId = UrlParameter.Optional }
);


context.MapRoute(
"Change_Status_Old_Members",
"Admin/Members/Status/Change/{MemberId}",
new { controller = "ProcessMembers",
action = "Process",
alternate="Processed",
MemberId = UrlParameter.Optional }
);

什么有效:

Html.ActionLink 帮助器使用路由并生成我期望的 url:

@Html.ActionLink("Process", MVC.Admin.ProcessMembers.Process(item.MemberId, "Unprocessed")

// Output (alternate="Unprocessed" and item.MemberId = 12): Admin/Unprocessed/Process/12


@Html.ActionLink("Status", MVC.Admin.ProcessMembers.Process(item.MemberId, "Processed")

// Output (alternate="Processed" and item.MemberId = 23): Admin/Members/Status/Change/23

在这两种情况下,输出都是正确的并且符合我的预期。

什么不起作用:

假设我的请求涉及第二个选项,即/Admin/Members/Status/Change/47,对应于alternate =“Processed”且MemberId为47。

调试我的静态 CurrentBranch 属性(见下文),我发现 SiteMap.CurrentNode 显示:

PreviousSibling: null
Provider: {MvcSiteMapProvider.DefaultSiteMapProvider}
ReadOnly: false
ResourceKey: ""
Roles: Count = 0
RootNode: {Home}
Title: "Process"
Url: "/Admin/Unprocessed/Process/47"

即,对于/Admin/Members/Status/Change/47 的请求 URL,SiteMap.CurrentNode.Url 计算结果为 /Admin/Unprocessed/Process/47 。即,它忽略了 alternate 参数并使用了错误的路由。

CurrentBranch 静态属性:

/// <summary>
/// ReadOnly. Gets the Branch of the Site Map that holds the SiteMap.CurrentNode
/// </summary>
public static List<SiteMapNode> CurrentBranch
{
get
{
List<SiteMapNode> currentBranch = null;
if (currentBranch == null)
{
SiteMapNode cn = SiteMap.CurrentNode;
SiteMapNode n = cn;
List<SiteMapNode> ln = new List<SiteMapNode>();
if (cn != null)
{
while (n != null && n.Url != SiteMap.RootNode.Url)
{
// I don't need to check for n.ParentNode == null
// because cn != null && n != SiteMap.RootNode
ln.Add(n);
n = n.ParentNode;
}
// the while loop excludes the root node, so add it here
// I could add n, that should now be equal to SiteMap.RootNode, but this is clearer
ln.Add(SiteMap.RootNode);

// The nodes were added in reverse order, from the CurrentNode up, so reverse them.
ln.Reverse();
}
currentBranch = ln;
}
return currentBranch;
}
}

问题:

我做错了什么?

路由按我的预期由 Html.ActionLlink 解释,但未按我的预期由 SiteMap.CurrentNode 评估。换句话说,在评估我的路线时,SiteMap.CurrentNode 会忽略区分备用参数。

最佳答案

我认为这是因为您试图从参数中获取路线。基本上,MVC 只是试图猜测您可能指的是哪条路线。

正确的方法是按名称处理路由。因此站点地图应该引用路线名称而不是 Controller 、操作等。

关于asp.net-mvc-4 - MVC SiteMap - 当不同节点指向相同操作时 SiteMap.CurrentNode 未映射到正确的路线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12582748/

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