2011-07-18 8 views
6

ASP.NET MVC3/Razor。MVC3 URLエンコーディング?

@Html.ActionLink(product.Title, "Detail", "Products", new { id = product.ProductID }, null) 

MVC3エンジンは私の商品リンクを作成します。

は、私はアクションリンクを作成するときに、このように、と言うことがわかりました。例:

http://myhost/{ActionUrl}/PRODID 

ただし、自分のプロダクトIDに特殊文字が含まれていると、URLエンコードされません。

http://myhost/{ActionUrl}/PROD/ID 

もちろん、これによってルーティングが中断されます。 私の質問は次のとおりです:

  1. 私はそれが自動的に値をエンコードすることを期待する必要がありますか?それを設定する方法はありますか?
  2. そうでなければ、それらをエンコードしてデコードする最もクリーンな方法は何ですか?私は本当にすべてのコントローラでそれをしたくありません。

ありがとう!

答えて

4

IDに特殊文字が含まれている場合は、パスの一部ではなくクエリ文字列として渡すことをお勧めします。凹凸のある道路に備えていない場合。 following blog postをチェックアウトしてください。

+0

実現するまでにはしばらく時間がかかりましたが、あなたの答えはまったく正しいです。特定の文字は予約されたキーワードに似ており、あなたはそれについて何もできません。他の人にとっては奇妙なことやキャッチオールルートを使うこともできますが、特殊文字の中にはそのようにとどまるものがあります(正規表現で書き直しをしない限り)。 – Alpha

+1

それでは、クエリ文字列として使うコードは何ですか? –

1
私は、これはパスで動作するように、しかし@Darinが、ここで指摘したようにqueryStringパラメータとしてこの作業を行うために取得コードではありませんでした

@Html.ActionLink(product.Title, "Detail", "Products", new { id = product.ProductID }, "") 

が私のためにクエリ文字列としてActionLinkのを作成しましたこのように:私のProductControllerで

routes.MapRoute(
     "ProductDetail", 
     "Products/Detail", 
     new { controller = "Products", action = "Detail" } 
     ); 

Global.asax.csの私のルートは、このように見えました

public ActionResult Detail(string id) 
{ 
    string identifier = HttpUtility.HtmlDecode(id); 
    Store.GetDetails(identifier); 
    return RedirectToAction("Index", "Home"); 
} 
+0

"PRODUCTID"に "/"または "#"が含まれているとどうなりますか?コントローラーは何を受け取るのですか? – Alpha

+0

コントローラは/ 2fとしてエンコードされています。 HttpUtility.HtmlDecodeはそれをスラッシュに変換し直します。私は#をテストするためのコード設定がありませんが、コントローラが%23を受け取ると期待しています。 –

+0

ありがとう、それは意味があります。私もあなたがそれをクエリ文字列に移動したのを見ましたが、私はそれをパスセクションで処理しています。エンコードしても、パスの形成を破ります。私はその道でそれを処理する方法を探していました。ありがとう! – Alpha

関連する問題