C# 路由具有相同架构的多个url时的路由表问题

C# 路由具有相同架构的多个url时的路由表问题,c#,routes,C#,Routes,守则: public static void RegisterRoutes(System.Web.Routing.RouteCollection routes) { routes.MapPageRoute("Partners Details", "Partner/{PartnerName}", "~/Partners/PartnerDetails.aspx", false, new RouteValueDictionary()); routes.MapPageRoute("Par

守则:

public static void RegisterRoutes(System.Web.Routing.RouteCollection routes)
{
    routes.MapPageRoute("Partners Details", "Partner/{PartnerName}", "~/Partners/PartnerDetails.aspx", false, new RouteValueDictionary());
    routes.MapPageRoute("Partners Offers", "Partner/{PartnerID}", "~/Partners/Partners.aspx", false, new RouteValueDictionary());
}

这些路由Url可以从default.aspx页面中的不同链接标签调用,但问题是当我尝试访问partners.aspx时,它会将我重定向到PartnerDetails.aspx我很困惑为什么会出现这种奇怪的行为?那么解决方案是什么呢?

所以问题是除了数据类型之外,路由是相同的。但是,您尚未为这些管线指定
约束。让我们这样做:

routes.MapPageRoute("Partners Details",
    "Partner/{PartnerName}",
    "~/Partners/PartnerDetails.aspx",
    false,
    new RouteValueDictionary(),
    new RouteValueDictionary() {
        "PartnerName", "[a-zA-Z\s]"
    });

routes.MapPageRoute("Partners Offers",
    "Partner/{PartnerID}",
    "~/Partners/Partners.aspx",
    false,
    new RouteValueDictionary(),
    new RouteValueDictionary() {
        "PartnerID", @"\d"
    });
但让我们把它分解一下。
约束
使用正则表达式确定键位置(例如PartnerID)中的字符串值是否匹配。如果没有,则跳过该路由,并继续下一个路由。但我想让你想想为什么它也不起作用。假设您必须编写代码来解释路由,您得到了如下链接:

http://.../Partner/123
这不符合
“Partner/{PartnerName}”
?我的意思是,
{PartnerName}
不是通过任何方式键入的,它只是一个占位符,对吗


希望这是有意义的。

所以问题是除了数据类型之外,路由是相同的。但是,您尚未为这些管线指定
约束。让我们这样做:

routes.MapPageRoute("Partners Details",
    "Partner/{PartnerName}",
    "~/Partners/PartnerDetails.aspx",
    false,
    new RouteValueDictionary(),
    new RouteValueDictionary() {
        "PartnerName", "[a-zA-Z\s]"
    });

routes.MapPageRoute("Partners Offers",
    "Partner/{PartnerID}",
    "~/Partners/Partners.aspx",
    false,
    new RouteValueDictionary(),
    new RouteValueDictionary() {
        "PartnerID", @"\d"
    });
但让我们把它分解一下。
约束
使用正则表达式确定键位置(例如PartnerID)中的字符串值是否匹配。如果没有,则跳过该路由,并继续下一个路由。但我想让你想想为什么它也不起作用。假设您必须编写代码来解释路由,您得到了如下链接:

http://.../Partner/123
这不符合
“Partner/{PartnerName}”
?我的意思是,
{PartnerName}
不是通过任何方式键入的,它只是一个占位符,对吗


希望这是有意义的。

但如果我有另一条路线,我仍然有一个问题,比如:routes.MapPageRoute(“合作伙伴提供”、“Store/{StoreID}”、“Stores/Store.aspx”、false、new RouteValueDictionary()、new RouteValueDictionary(){StoreID]、@“\d});“我想问题可能还在这里,对吗?”索拉,我不确定我是否明白。这是一条与上述路线完全不同的路线。根据您定义它的方式,它应该可以正常工作。我想展示一个想法,但我猜我给出了错误的示例,嗯,假设它是同一个路由,但是我发送的是PartnerId,而不是StoreID,我们可以看到PartnerId和StoreID都是Id,所以正则表达式对于两个整数有效,前提是路由表如何猜到这一点这是partnerId而不是storeId?@Sora,这是一个更复杂的问题。它将选择第一个匹配的。我想说的是,你需要在id前面加上一些东西,比如
p123
vs.
s123
,然后在控制器中取下这个整数,或者你需要将路径改为
Partner/Store/{StoreID}
。但如果假设我有另一条路线,我仍然有一个问题,比如:routes.MapPageRoute(“合作伙伴提供”、“Store/{StoreID}”、“Stores/Store.aspx”、false、new RouteValueDictionary()、new RouteValueDictionary(){“StoreID”、@“\d”);“我想问题可能还在这里,对吗?”索拉,我不确定我是否明白。这是一条与上述路线完全不同的路线。根据您定义它的方式,它应该可以正常工作。我想展示一个想法,但我猜我给出了错误的示例,嗯,假设它是同一个路由,但是我发送的是PartnerId,而不是StoreID,我们可以看到PartnerId和StoreID都是Id,所以正则表达式对于两个整数有效,前提是路由表如何猜到这一点这是partnerId而不是storeId?@Sora,这是一个更复杂的问题。它将选择第一个匹配的。我想说的是,您需要在id前面加上一些东西,比如
p123
vs.
s123
,然后在控制器中提取该整数-或者您需要将路由更改为类似
Partner/Store/{StoreID}