RouteValueDictionary 忽略空值

问题描述 投票:0回答:2

我在查询字符串中想要的空路由值很少:

var routeValues = new RouteValueDictionary();
routeValues.Add("one", "");
routeValues.Add("two", null);
routeValues.Add("three", string.Empty);

如果我将其传递给

UrlHelper.RouteUrl()
,它会忽略所有值,并且生成的查询字符串为空。然而,像
/?one=&two=&three=
这样的网址是完全有效的。我怎样才能做到这一点?

asp.net .net asp.net-mvc asp.net-mvc-5
2个回答
4
投票

此行为内置于默认 Route 类中。它调用 ParsedRoute.Bind() 方法来执行此检查:

if (IsRoutePartNonEmpty(obj2))
{
    acceptedValues.Add(key, obj2);
}

这是做什么的:

private static bool IsRoutePartNonEmpty(object routePart)
{
    string str = routePart as string;
    if (str != null)
    {
        return (str.Length > 0);
    }
    return (routePart != null);
}

这可以有效地防止输出任何查询字符串值(如果它们为空)。它所做的一切都是私有的、静态的、内部的,否则不可能被覆盖。因此,实际上只有 2 个选项可以覆盖此行为。

  1. 子类化 Route 并重写 GetVirtualPath(),用自定义实现替换 ParsedRoute.Bind()。
  2. 对 RouteBase 进行子类化并创建自定义路由实现。

我想第三个选项是不管它,正如其他人指出的那样,这并不是真正的问题,因为查询字符串中的空参数几乎没有价值。


0
投票

如果还需要给地址添加空值,可以这样操作:

(以JS为例...)

var rt = new RouteValueDictionary();
foreach (var it in rt)
{
    if (urlto != "")
    {
        urlto += "&";
    }
    urlto += it.Key + "=" + it.Value;
}
//Response.Redirect("hello?" + urlto);
Response.Redirect("../hello?" + urlto);
© www.soinside.com 2019 - 2024. All rights reserved.