2009-03-07 5 views
2

私はタグ名からURLを生成したい。私の見解ではどのようにStackoverflowのURLでエスケープタグ名をエスケープ

(のasp.net MVC)私は、次のしている:

<%= Html.ActionLink(Html.Encode(tagName), 
"tagged" //action, 
"posts" //controller, 
new {tagName=Html.UrlEncode(tagName)} //querystring argument, 
new {@class="tag"} //html attributes) 
%> 

しかし、tagNameをは(引用符なし) "のC#" であれば、これは、次のURLを生成します。

http://localhost/posts/tagged/c%2523 
同一の "C#の" タグ "がCの%23" の代わりに "C%の2523"

を生成するために不正な要求StackOverflowの上

、URL - [HTTP 400エラーが発生し

私はHtml.UrlEncode、Uri.EscapeDataString、Uri.EscapeUrlStringを試しましたが、それらのどれも望ましい "c%23"形式を生成しませんでした。

したがって、アンカーのtagNameをどのようにエンコードする必要がありますか?

答えて

3

c%2523はc%23のエンコードされた値であるため、URLの2つのエンコードを行っているようです。 (0x23 = ASCII 35 =#、0x25 = ASCII 37 =%)。 2つのエンコード呼び出し(Html.EncodeとHtml.UrlEncode)があるので、おそらくそれらのうちの1つを削除すると、問題が取り除かれます。

+0

もし私がエスケープしていなければ、エスケープされていないc#が出力され、ハッシュはURLフラグメントになります – gCoder

+0

最初のHtml.Encodeはリンクテキスト用ですので、アンカーのhref部分 – gCoder

+0

はい、それにも気付きました。私はまだASPを使用していないので、私は推測することができます。ところで、テスト目的で 'new {tagName = "c%23"}'のようなものを試すことができますか? – schnaader

0

#は、16進数のASCII値23に対応します。だから私は彼らが16進数の値を使用すると思います。

0

私が正しくリコールした場合、actionlinkは自動的にURLの値をエンコードしますので、Html.Encode(tagName)を削除してください。うまく見えるはずです。

0
<%= Html.ActionLink(Html.Encode(tagName), 
"tagged" //action, 
"posts" //controller, 
new {tagName=Html.UrlEncode(tagName)} //querystring argument, 
new {@class="tag"} //html attributes) 
%> 

Html.ActionLinkはHTMLを作成し、エスケープする問題を処理します。リンクテキストを明示的にHtml.Encodeしたり、パラメータをHtml.UrlEncodeしたりしないでください。

パラメータ値の「#」がエスケープされていない場合、ActionLink()のバグのように聞こえ、リンクを自分で生成する必要があります。

+0

私はそれがHtml.AttributeEncode()リンクのすべての属性を見たので、問題があります。有効な属性文字列であるため、 "c#"文字列はエスケープされませんが、最初に "c#"をURLエンコードすると、すでにエスケープされた文字列がAttributeEncode()になります。この場合、私はヘルパーを完全にスキップしなければならない – gCoder

+0

AttributeEncodeは、UrlEncodeとはまったく異なるプロセスです。まず、有効なURLを取得するために使用するURLの部分をUrlEncodeします。 URLの有無に関わらず、すべての属性値をAttributeEncodeまたはHtmlEncodeします。 AttributeEncodeは ''&lt;&についてのみで、 '#'や '%23'には触れません。 – bobince

+0

はっきりとActionLinkヘルパーは、それを混乱させる "何か"をしています。私はそれをスキップし、 "..."を使用し、私は仕事をしました.. – gCoder

関連する問題