2008-10-27 46 views
7

在我的網絡應用程序中,我的參數可以包含各種瘋狂的字符(俄語字符,斜線,空格等),因此不能總是在URL中表示爲。
發送他們的快樂方式將在大約50%的情況下工作。有些東西像空格已經編碼在某處(我在Html.BuildUrlFromExpression中猜測)。其他東西雖然(如「/」和「*」)不是。Double/incomplete參數網址編碼

現在我不知道該怎麼做了,因爲如果我自己對它們進行編碼,我的編碼會再次進行部分編碼,並最終出錯。如果我不編碼它們,一些字符將無法通過。

我所做的是手動.replace()我遇到的問題。
這當然不是一個好主意。

想法?

- 編輯 -
我知道在我手上有編碼/解碼庫,衆說紛紜。 它看起來像mvc框架已經試圖爲我做,但不完全。

<a href="<%=Html.BuildUrlFromExpression<SearchController>(c=>c.Search("", 1, "a \v/&irdStr*ng"))%>" title="my hat's awesome!"> 

會使我

<a href="/Search.mvc/en/Search/1/a%20%5Cv/&irdStr*ng" title="my hat's awesome!"> 

注意如何正斜槓,星號和符號都沒有逃過。 爲什麼有些人會逃跑而其他人不會呢?我現在怎樣才能正確地逃避這一切?

我做錯了什麼或者它是框架?

回答

0

您是否嘗試過使用Server.UrlEncode()方法進行編碼,並使用Server.UrlDecode()方法進行解碼?

我對使用它傳遞項目沒有任何問題。

+0

感謝您的反饋。請參閱我的原始帖子,瞭解我所做的修改。我想我的問題還不夠清楚。 – 2008-10-27 16:05:40

0

Server.URLEncodeHttpServerUtility.UrlEncode

我看你現在說的話 - 我沒有意識到的問題是具體到MVC。看起來像MVC框架的這一部分的侷限性 - 特別是BuildUrlFromExpression正在做一些URL編碼,但它知道也需要一些標點作爲框架URL的一部分。

而且也很遺憾,URL編碼不產生不變,即

URLEncode(x) != URLEncode(URLEncode(x)) 

那不是很好。然後你可以預先編碼你的變量,它們不會被雙重編碼。

這可能是一個ASP.NET MVC框架的最佳實踐。我想你可以做的另一件事是編碼成base64或URLEncode不變的東西。

+0

UrlEncode奇怪的是不使用這個http://www.w3schools.com/TAGS/ref_urlencode.asp。例如,空間被編碼爲%25。 – 2008-10-27 15:23:07

+0

HttpUtility.UrlPathEncode雖然 – 2008-10-27 15:24:30

+0

確實,這是我的問題。感謝您再次通過。 – 2008-10-28 13:36:16

2

參數應使用Uri.EscapeDataString轉義:

  string url = string.Format("http://www.foo.bar/page?name={0}&address={1}", 
       Uri.EscapeDataString("adlknad /?? lkm#"), 
       Uri.EscapeDataString(" qeio103 8182")); 

      Console.WriteLine(url); 
      Uri uri = new Uri(url); 
      string[] options = uri.Query.Split('?','&'); 
      foreach (string option in options) 
      { 
       string[] parts = option.Split('='); 
       if (parts.Length == 2) 
       { 
        Console.WriteLine("{0} = {1}",parts[0], 
         Uri.UnescapeDataString(parts[1])); 
       } 
      } 
+0

感謝您的反饋,但請注意asp.net-mvc標籤。我編輯了我的問題來澄清事情。 – 2008-10-27 16:04:45

+0

標籤變化很快;我只是原來的問題去了;-p但足夠公平... – 2008-10-27 22:37:03

0

出於安全原因(通過,它在單聲道中工作),URL的路徑部分中的正向斜線和點的轉義被禁止。

0

需要修復Html.BuildUrlFromExpression,然後將這個上游提交給MVC項目......或者在傳遞給BuildUrlFromExpression之前對該字符串進行編碼,並在另一端返回時將其解碼。

它可能不容易解決,因爲IIS可能會事先處理url字符串的解碼...可能需要爲實用程序方法中的替代路徑字符執行一些更高級的編碼/解碼操作,並代表您進行解碼出來。

1

正如其他人所提到的,如果你先編碼你的字符串,你會避免這個問題。

MVC框架正在對它知道需要編碼的字符進行編碼,但保留那些有效的URL字符(例如&%?* /)。這是因爲這些URL是有效的字符,儘管它們是URL中的特殊字符,可能無法實現您所追求的結果。

0

我在這看過類似的帖子。太我了,它看起來像MVC中的缺陷。該函數將更適當地命名爲「BuildUrlFromEncodedExpression」。更糟糕的是,被調用函數需要解碼其輸入參數。育。

如果在編碼的字符BuildUrlFromExpression()和調用者編碼的字符之間有任何重疊(爲了簡單起見,我認爲它們可能相當簡單地編碼任何非字母數字),那麼您有可能發生令人討厭的錯誤。