2012-04-25 9 views
2

背景:私は、MVCアプリケーションのいくつかのURL操作を試みています。私はクエリ文字列の値を別のものに置き換えるHtmlHelper拡張メソッドを書いています。このメソッドは現在の要求文字列を取り、Foo = 1、Foo = 1、Hello、World、2として読み取られることを避けるように、Foo = 1 & Foo = Hello%2c%20World!& Foo = 2を手動で分割します。 UriBuilderとUriを使用してURLを取得しようとします。Uriが部分的にクエリ部分をデコードするのはなぜですか?

問題:何らかの理由で、Uri.ToStringがクエリ文字列を部分的にデコードします。簡単なテストとして、私はLINQPadを解雇し、以下を実行しました:

var ub = new System.UriBuilder("http://foobar"); 
ub.Query = "NY%26A"; // NY&A 
ub.Uri.Dump(); 
ub.Uri.ToString().Dump(); 
ub.Uri.Query.Dump(); 
ub.ToString().Dump(); 

結果は以下のとおりです。

http://foobar/?NY&A 
http://foobar/?NY&A 
?NY%26A 
http://foobar:80/?NY%26A 

私はエスケープ文字をたくさん使用している場合、それはいくつかを復号化しているため、部分的に、デコード言います所定の位置に他の人を残し:

var ub = new System.UriBuilder("http://foobar"); 
ub.Query = "!%40%23%24%25%5E%26*()"; // [email protected]#$%^&*() 
ub.Uri.Dump(); 
ub.Uri.ToString().Dump(); 
ub.Uri.Query.Dump(); 
ub.ToString().Dump(); 

と結果:

http://foobar/[email protected]%23$%25^&*() 
http://foobar/[email protected]%23$%25^&*() 
?!%40%23%24%25%5E%26*() 
http://foobar:80/?!%40%23%24%25%5E%26*() 

質問:誰かが何が起こっているのか説明できますか?

答えて

1

"安全な"デコードを使用しているようです。 2番目の例では、URIの構造/意味が変更されるため、#または%はデコードされません。

このデコードを実行したくない場合は、URIに.ToString()をコールしないで、直接必要なコンポーネントにアクセスしてください。

+0

感謝を。私はなぜそれがデコードされているのだろうか?それはURIの意味を変えるからです。私の目標は、既存のURIを受け取り、何かを変更し、URI全体を取り戻すことでした。 .NETクラスがなくても簡単にやっていましたが、何が起こっているのか理解したかったのです。 –

1

URIはURLエンコードし

を使用しないので、あなたは、元の読み取りまたはURIオブジェクトにエンコードされた値を追加するためにこれを使用することができます:返信用

 System.Web.HttpUtility.UrlDecode("NY%26A"); 
     System.Web.HttpUtility.UrlEncode("NY&A"); 
関連する問題