2

背景: MVC アプリケーションの URL 操作をしようとしています。クエリ文字列値を別の値に置き換える HtmlHelper 拡張メソッドを作成しました。このメソッドは現在のリクエスト文字列を取得し、(Foo=1&Foo=Hello%2c%20World!&Foo=2 が Foo=1,Hello, World,2 として読み取られるのを防ぐために) クエリ部分を手動で分割してから、 UriBuilder と Uri を使用して URL を取得します。

問題: 何らかの理由で、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*()"; // !@#$%^&*()
ub.Uri.Dump();
ub.Uri.ToString().Dump();
ub.Uri.Query.Dump();
ub.ToString().Dump();

そして結果:

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

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

4

3 に答える 3

1

URI は URL エンコードを使用するため

これを使用して、元の値を読み取ったり、エンコードされた値を URI オブジェクトに追加したりできます。

        System.Web.HttpUtility.UrlDecode("NY%26A");
        System.Web.HttpUtility.UrlEncode("NY&A");
于 2012-04-25T17:59:01.940 に答える
1

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

デコードが行われたくない場合は.ToString()、URI での呼び出しを停止し、代わりに必要なコンポーネントに直接アクセスします。

于 2012-04-25T17:54:14.337 に答える