RouteValueDictionary忽略空值

时间:2014-02-25 08:59:48

标签: asp.net .net asp.net-mvc asp.net-mvc-5

我在查询字符串中有几个空路由值:

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

如果我然后将其传递给UrlHelper.RouteUrl(),它将忽略所有值,并且生成的查询字符串为空。但是,像/?one=&two=&three=这样的网址完全有效。我怎么能这样做?

1 个答案:

答案 0 :(得分:2)

此行为内置于默认的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);
}

这有效地防止了任何查询字符串值为空时输出。它所做的一切都是私有的,静态的,内部的,否则无法覆盖。因此,实际上只有两个选项可以覆盖此行为。

  1. 子类路由并覆盖GetVirtualPath(),用自定义实现替换ParsedRoute.Bind()。
  2. Subclass RouteBase并创建自定义路由实现。
  3. 我猜第三个选项是不管它,因为其他人已经指出这不是一个问题,因为查询字符串中的空参数很少或没有值。