2010-04-07 74 views
4

這工作得很好:如何向ASP.NET MVC2控制器發送包含冒號的GET請求?

GET /mvc/Movies/TitleIncludes/Lara%20Croft 

當我提交包含冒號的請求,就像這樣:

GET /mvc/Movies/TitleIncludes/Lara%20Croft:%20Tomb 

...它生成一個400錯誤。錯誤說ASP.NET在URL中檢測到無效字符。

如果我嘗試網址轉義,請求如下:

GET /mvc/Movies/TitleIncludes/Lara%20Croft%3A%20Tomb 

...而這也給了我一個400錯誤。

如果我用| :

GET /mvc/Movies/TitleIncludes/Lara%20Croft|%20Tomb 

..這也被認爲是非法的,這次有500個錯誤。消息:路徑中的非法字符。

URL-escaping that |導致相同的錯誤。


我真的,真的不想使用查詢字符串參數。


相關:
Sending URLs/paths to ASP.NET MVC controller actions

回答

3

我發現URL編碼沒有工作,但自定義編碼一樣。
我猜ASPNET MVC使用文件系統來執行解析和路由,因爲URL中的一個字符在文件系統中不合法,會導致500或400錯誤。

所以我做的是用javascript代碼中的字符替換冒號,然後在動作中做相反的處理。像這樣:

瀏覽器:

function myEscape(s){ 
    return s.replace(':', '%C2%A1').trim(); 
} 
在行動

,使用前面的參數調用此轉換:

private string MyCustomUnescape(string arg) 
{ 
    return arg.Replace("¡", ":"); 
} 

同樣的方法適用於斜槓 - 只是選擇不同的Unicode字符。當然,如果你的字符串參數本身是unicode,那麼你必須使用不可打印的字符作爲「編碼」形式。

1

如果SEO不是問題,您可以使用base64,然後urlencode。在第一步之後,你將擁有的每個角色都將很容易編碼。在.NET中解碼就像在System.Web.HttpUtility和System.Convert中使用助手一樣簡單。

0

類似在這裏找到答案: https://stackoverflow.com/a/12037000/134761

使用問號和參數和URL編碼參數&符號。

例如:GET/mvc/Movies/TitleIncludes?title = Lara%20Croft%3A%20Tomb

我同意這將是很好的東西編碼到網址以及,但有可能是一個不錯的理由。