0

我有一个路由规则:

routes.MapRoute("HotToursPage",
            "HotTours/{countryTo}/{resort}/{param1}/{param2}/{param3}/{param4}/{param5}",
            new
            {
                controller = "HotTours",
                action = "Index",
                countryTo = UrlParameter.Optional,
                resort = UrlParameter.Optional,
                param1 = UrlParameter.Optional,
                param2 = UrlParameter.Optional,
                param3 = UrlParameter.Optional,
                param4 = UrlParameter.Optional,
                param5 = UrlParameter.Optional
            }
        );

在我的代码中:

var dictionary = new RouteValueDictionary();
        aaa.Add("countryTo", countryToInfo.Translit);
        aaa.Add("resort", resort);
        aaa.Add("param1", param1);
string url = urlHelper.Action("Index", "HotTours", dictionary);

如果有param5、param6等,那么

url =/hottours/?countryTo=tailand&resort=bangkok¶m1=price_from_50000,

但如果我删除 param5、param6 和其他,那么一切正常:

网址 =/hottours/tailand/曼谷/price_from_50000

为什么如果段数小于 7,一切正常?我需要 9 个段,但 urlHelper 在这种情况下会构建错误的 url。

4

2 回答 2

1

构建 URL 时,您必须提供 URL 模式中的所有路由值。有一个例外 - 当最后一个参数是可选的时,您不需要包含它。

因此,要始终如一地处理长 URL 模式中可能是可选的段,您需要多个路由。每条路线只能有一个UrlParameter.Optional,并且必须是最右边的路段。

routes.MapRoute("HotToursPage3",
    "HotTours/{countryTo}/{resort}/{param1}/{param2}/{param3}/{param4}/{param5}",
    new
    {
        controller = "HotTours",
        action = "Index",
        param5 = UrlParameter.Optional
    }
);

routes.MapRoute("HotToursPage2",
    "HotTours/{countryTo}/{resort}/{param1}/{param2}/{param3}",
    new
    {
        controller = "HotTours",
        action = "Index",
        param3 = UrlParameter.Optional
    }
);

routes.MapRoute("HotToursPage1",
    "HotTours/{countryTo}/{resort}/{param1}",
    new
    {
        controller = "HotTours",
        action = "Index",
        param1 = UrlParameter.Optional
    }
);

注意:我在这里假设您的{countryTo}{resort}参数是必需的。将它们设为可选似乎并不明智。但是,如果我弄错了,您需要另一条路线来处理这两个段是可选的,或者您应该为它们提供合理的默认值。一般来说,如果一个值没有合理的默认值,那么它应该在 URL 中是必需的。

请注意,如果没有提供右侧的段,您仍然只能将段设为可选。因此,这种组合将起作用:

var dictionary = new RouteValueDictionary();
dictionary.Add("countryTo", "test1");
dictionary.Add("resort", "test2");
dictionary.Add("param1", "test3");
var url = Url.Action("Index", "HotTours", dictionary);

但是这种组合仍然会构建一个查询字符串:

var dictionary = new RouteValueDictionary();
dictionary.Add("countryTo", "test1");
dictionary.Add("resort", "test2");
dictionary.Add("param1", "test3");
dictionary.Add("param2", "test4");
dictionary.Add("param5", "test5");
var url = Url.Action("Index", "HotTours", dictionary);

如果您希望所有 5 个参数都是可选的(并且以任何顺序),您应该使用查询字符串,而不是将它们放入路径中。

routes.MapRoute("HotToursPage",
    "HotTours/{countryTo}/{resort}",
    new
    {
        controller = "HotTours",
        action = "Index"
    }
);

另一种选择(我不推荐)是建立一系列具有标识符段的路由,这允许您以任何顺序放置值。请参阅ASP.Net MVC 使用 Route 处理段

于 2016-05-30T11:03:22.440 回答
-1

正如您在下面提到的那样,没有什么是主要原因

Http.sys 服务的编码默认为每个 Url 段最多 260 个字符。

此上下文中的“Url 段”是Url 中“/”字符之间的内容。例如:

可以使用注册表设置更改允许的最大 Url 段长度:

Key: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\HTTP\Parameters
Value: UrlSegmentMaxLength
Type: REG_DWORD
Data: (Your desired new Url segment maximum allowed length, e.g. 4096)

允许的最大值为 32766。如果指定了较大的值,将被忽略。

需要重新启动 PC 才能使对此设置的更改生效。

于 2016-05-30T09:54:03.030 回答