2017-02-13 40 views
0

當序列化對象以查詢字符串值時,如何覆蓋Flurl的默認行爲?例如。下面的代碼Flurl(Fluent Url)自定義序列化

DateTime date = new DateTime(2017, 1, 2, 3, 4, 5); 
Url url = "http://domain.com".SetQueryParam("date", date); 

產生以下網址:

http://domain.com?date=01%2F02%2F2017%2003%3A04%3A05 

我想是這樣的:

http://domain.com?date=2017-01-02T03%3A04%3A05.0000000 

這將是如下序列化日期的結果:

date.ToString("O") 

回答

0

Flurl小心o f URL編碼,但除此之外並不關心自定義字符串格式。我想最明顯的方式做你想做的是這樣的:

"http://domain.com".SetQueryParam("date", date.ToString("O")); 

如果你這樣做了很多,並希望避免每次都指定格式位,你可以添加自己的擴展方法(一個用於Url和一個用於string,每pattern):

public static Url SetDateParam(this Url url, string name, DateTime date) 
{ 
    return url.SetQueryParam(name, date.ToString("O")); 
} 

public static Url SetDateParam(this string url, string name, DateTime date) 
{ 
    return new Url(url).SetDateParam(name, date); 
} 

那麼你已經有了:

"http://domain.com".SetDateParam("date", date); 
+0

感謝@Tod,這是一個恥辱Flurl不允許定義小號各種類型的序列化規則。更令人討厭的是,日期序列化甚至不尊重線程的當前文化,並被硬編碼爲m/d/y。爲什麼不是規範的y-m-d格式,這正是我試圖實現的目標?如果我將查詢字符串中的日期發送到正在運行的服務器上。澳大利亞的區域設置,它會嘗試將其解釋爲d/m/y,並且我的一半日期會出錯。現在我決定不使用Flurl並編寫我自己的查詢字符串構建器... – Andrew

+1

@Andrew我在這裏以幾個方面質疑您的判斷。首先,我根本不覺得這個功能根本不存在,至今沒有人提出要求。在抱怨之前,您是否考慮在GitHub上記錄建議或提交PR?其次,我提出了兩個非常簡單,直接的解決方案,用Flurl來做你想要的。如果你閱讀並理解他們,並且仍然認爲放棄它並編寫自己的建築師是你的最佳選擇,那麼恐怕我不會遵循你的思維過程。 –

+0

@@ Todd對不起,我沒有意識到你是Flurl的作者,可能會親自發表我的評論。我並不是批評這個組件,我認爲這很棒,我有所有的意圖去使用它,直到我發現這種行爲。你提出的解決方案不適合我。你說你「不要按照我的思維過程」,但你不知道我的確切要求。坦率地說,當您決定將日期序列化硬編碼爲m/d/y而不是使用明確的y-m-d時,我也不會遵循您的思考過程。你能解釋一下嗎? – Andrew