2011-05-05 51 views
7

我有我的看法如下代碼:如何網址,ASP .NET MVC編碼參數

<%= Html.ActionLink(
      "View item", 
      "Index", 
      "Items", 
      new 
      { 
       itemName = Model.ItemName 
      }, 
      null) %> 

我當項目名稱包含銳(#)的一個問題或百分號(%) 。

  • 當物品名稱是"name#with#sharp#",控制器接收唯一的名稱的第一部分,直到第一尖銳(僅接收"name")。

  • 當項目名稱爲"name%with%percent"時出現錯誤:HTTP錯誤400 - 錯誤的請求。

我不知道這是URL編碼的問題,因爲它與其他抵觸的字符,如工作:

; 
= 
+ 
, 
~ 
[blank] 

你知道我怎麼能解決這個問題?

在此先感謝。

+0

哪些網址正在生成?當我用'%'符號嘗試你的例子時,我得到這個:'http:// localhost/AspNetMvc2/Items?itemName = name%25with%25percent',並且沒有錯誤。另外,帶'#'符號的例子產生這樣的結果:'http:// localhost:55386/Items?itemName = name%23with%23sharp%23' – 2011-05-05 17:25:22

回答

11

我假設你有一個路線設置和您的網址看起來像這樣:

http://localhost/Items/Index/name%25with%25percent - (這將炸燬)

與此相反:

http://localhost/Items/Index/?itemName=name%25with%25percent - (查詢字符串是好的)

所以一個選項是從您的路由(在您的RouteCollection)中刪除「itemName」屬性,以便Html.ActionLink將使用itemName作爲QueryString參數呈現Url。

正如@Priyank所說,問題是因爲itemName是Url的一部分(不是QueryString參數),它包含非法字符。

+0

是的,你假設是正確的。所以使用%符號的唯一地方就是查詢字符串。有沒有其他方式可以在網址中使用%? – 2011-05-06 08:32:55

0

你應該能夠使用你的視圖的UrlHelper實例爲你做這個。試試這個給人打預防針:

<%= Html.ActionLink( "View item", "Index", "Items", new { itemName = Url.Encode(Model.ItemName) }, null) %>

更新

測試後,似乎明確地編碼像我一樣,上面似乎是準確,將導致服務器雙編碼(例如 - %會在url中以%2525的形式出現)。

+1

這是不夠的。 IIS正在將name + hello轉換爲名稱%25%2bhello,該請求失敗,並且請求不好 – 2011-05-05 17:01:17

+0

對我來說,無論我是否編碼,都會出現問題。 200全狀態代碼。它實際上似乎是最準確的,當我**不**編碼,並讓路由和IIS通常做他們的事情。剛剛在Casini和IIS Express中使用銳利(#),百分比(%)和加號(+)示例進行了測試。你使用的是什麼版本的IIS? – JasonOffutt 2011-05-05 17:42:44

+1

重現這個問題,你將不得不使用一個名爲itemName的標記來設置一個路由 - 所以這個url看起來像這樣:localhost/Items/Index/name%25with%25percent - 這個url包含非法字符 – 2011-05-05 19:48:12

4

由於這些路由值是作爲URL字符串的一部分發布的,因此它們將被視爲單獨的值,用#和%分隔。有幾個選項可以處理你的情況。

您將不得不實施您的自定義ValueProvider (IValueProvider and especially RouteDataValueProvider)來處理您的自定義需求。一個程序員遇到了字符'/'的問題,他在這裏入侵了它http://mrpmorris.blogspot.com/2012/08/asp-mvc-encoding-route-values.html

其次是在TempData中存儲值,該值持續存在於兩個請求中並使用它們。

希望這有助於思考正確的方向。