2014-02-25 94 views
1

我有几个空路由值我想查询字符串:RouteValueDictionary忽略空值

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

如果我把它传递给UrlHelper.RouteUrl()它忽略所有的值和生成的查询字符串是空的。但是,像/?one=&two=&three=这样的网址完全有效。我怎样才能做到这一点?

+0

'String.Empty'是否会产生相同的结果? –

+0

它的确如此。更新了帖子。 – UserControl

+2

我在这里看不到问题。 –

回答

2

此行为内置于默认路由类中。它调用到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. 子类路由并覆盖GetVirtualPath(),用自定义实现替换ParsedRoute.Bind()。
  2. 子类RouteBase并创建一个自定义的路由实现。

我想第三个选项是让它独立,因为其他人指出这不是一个真正的问题,因为在查询字符串中有一个空参数很少或没有价值。

+0

字符串很好。但它也忽略了Guid.Empty(00000000-0000-0000-0000-000000000000)。不幸的是,你不能使用Guid.Empty作为默认的动作参数,因为它不是一个编译时常量。 – Kev