發表文章

目前顯示的是 6月, 2017的文章

如何在 MVC 的 Route 中的URL {controller}/{action}/{ID} 中傳遞包含 "." 句號

圖片
前言 最近做 ASP.NET MVC 內部教育訓練時,因為同仁問的一個看似很蠢的問題,但是卻讓我發現一個我從來壓根子就不會想過,要在 {ID} 裡面傳遞的 primaryKey 的內容居然包含句號 ".”,因為眾所皆知,句號在 Url 裡面,應該是保留字元,且 RFC 3986 規範中定義了在 Url 裡面那些是保留字,如果URL中使用到了這些保留字,這時候就需要使用 UriEncoding 將其編碼為「 %HEXHEX 」的形式。 MVC 的 Route 中 {id} 中包含句號的問題 事情是這樣的,課堂中,實作一個 MVC 基本表單,包含清單與 (CRUD) 等 View 畫面,於是撰寫的假資料來測試從 List 到 Details 的畫面。 由於為求簡單,所以 ViewModel 只有兩個欄位:EmpName、Title,於是我將 EmpName 充當 ID 使用,傳入到 Details 畫面,因此我們直接修改 MVC 的範本如下: 但是,當程式執行後,並在這個畫面點選了這個 ActionLink 後,卻出現如下 404.0 Not Found 我發現,學員傳入的 id 為 gelis.wu,也就是說,當中有一個句號 “.”,但是我們不是有將 id 的內容用 UrlEncoding 包起來嗎?後來爬文了一下,才想起來,就是以 HTTP 所使用的 application/x-www-form-urlencoded 的編碼規則來說,字符"a"-"z","A"-"Z","0"-"9",".","-","*",和"_" 都不會被編碼,也就是說 gelis.wu 會照實丟出去,這些東西真的太久沒用就會忘,因為長久以來心中總是會有一種根深蒂固的觀念就是,從開始接觸 HTTP 到現在,應該都沒改過這些東西,應該都一樣,但有時就因為這種想法,導致類似問題都認為,這理所當然地而未加以細心思考,但是,事實上,除了 EmpName=test2 與 test2 可以導向到 Details 畫面之外,如果 EmpName 包含句號,就是不能執行,為什麼 II