urlHelper 构建错误的路径.. 这是什么原因?

The urlHelper build wrong path.. What is a rison for this?

我的路由规则为:

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 和其他,则一切正常:

url=/hottours/tailand/bangkok/price_from_50000

为什么段数小于7就可以了?我需要 9 个分段,但 urlHelper 在这种情况下构建错误 url。

没有像你下面提到的那样是主要原因

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

这里的"Url segment"是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。如果指定了一个更大的值,它将被忽略。

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

构建 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
    }
);

NOTE: I am assuming here that your {countryTo} and {resort} parameters are required. It doesn't seem that sensible to make them optional. However, if I am mistaken, you need another route to deal with those 2 segments being optional or alternatively you should provide sensible default values for them. Generally speaking, if there are no sensible defaults for a value it should be required in the URL.

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

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"
    }
);

另一种方法(我不推荐)是建立一系列具有标识符段的路由,这允许您以任何顺序放置值。参见