2014-02-25 93 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