2012-02-03 23 views
9

RedirectToAction()を使用して文字列パラメータを渡す方法を知りたいと思います。ASP.Net MVC:RedirectToAction()を使用してアクションに文字列パラメータを渡す

のは、私はこのルートがあるとしましょう:

routes.MapRoute(
    "MyRoute", 
    "SomeController/SomeAction/{id}/{MyString}", 
    new { controller = "SomeController", action = "SomeAction", id = 0, MyString = UrlParameter.Optional } 
); 

そしてSomeControllerでは、私は次のようにリダイレクトを行う作用を有する:

return RedirectToAction("SomeAction", new { id = 23, MyString = someString }); 

私は=「@#someStringで、このリダイレクトを試してみました! $%?& * 1 "という文字列をエンコードしても問題ありません。私は、HttpUtility.UrlEncode(someString)、HttpUtility.UrlPathEncode(someString)、およびUri.EscapeUriString(someString)を使用してそれをエンコードしようとしました。

私はsomeStringを渡すためにTempDataに頼っていましたが、それでも私の好奇心を満たすために、上のコードをどうやって作るのか不思議です。

+0

'web.config'で' relaxedUrlToFileSystemMapping'と 'requestPathInvalidCharacters'を変更しましたか? –

+0

@ EricYinいいえ、私はしませんでした。私はこれらの2つのパラメータを知らなかった。私はそれらを調べます。 –

答えて

3

あなたのルートオーダーまたはコントローラに問題があると思います。ここに私が働かなければならないコードがあります。

ルート定義

 routes.MapRoute(
      "TestRoute", 
      "Home/Testing/{id}/{MyString}", 
      new { controller = "Home", action = "Testing", id = 0, MyString = UrlParameter.Optional } 
     ); 

     routes.MapRoute(
      "Default", // Route name 
      "{controller}/{action}/{id}", // URL with parameters 
      new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults 
     ); 

// note how the TestRoute comes before the Default route 

コントローラのアクションメソッド

public ActionResult MoreTesting() 
    { 
     return RedirectToAction("Testing", new { id = 23, MyString = "Hello" }); 
    } 

    public string Testing(int id, string MyString) 
    { 
     return id.ToString() + MyString; 
    } 

私は/Home/MoreTestingを参照するとき、私は私のブラウザで出力する"23Hello"の所望の出力を得ます。ルートとコントローラコードを投稿できますか?

+2

私のコードはMyString = "Hello"で動作します。問題は特殊文字です。 MyString = "!@#$%?&* 1"を試してみると、私の言いたいことが分かります。 –

2

OK、この問題は数日前ですが、この問題がソートされているかどうかはわかりませんでした。私はこれをしばらく前に遊んでいましたが、これは問題がどのように解決できるかです。あなたの例では

あなたが持っている問題は、問題を引き起こし特殊文字「とは、%などの特殊文字、(私は20と思う)し、多くの一つであるということです。

問題は、%文字である。 Priyankhereで指摘したように:

ルート値は、URL文字列の一部として掲載されている

URL文字列は、(文字列parameteを照会ありません。 r)は%(%25)、 "(%22)などを処理できません。 はまた、同じポストにLee Gunnにより指摘したように: http://localhost:1423/Home/Testing/23/!%40%23%24%25%3f%26 *%201 - (これは爆破します)この問題を解決する方法の

1つのルートマッピングから{MyString}を除去することです。ルートマップを作成するには次のようになります。あなたがMyStringを設定したときに、それが動作するクエリ文字列パラメータに変換されます今

http://localhost:1423/Home/Testing/23?MyString=!%2540%2523%2524%2525%2B1

routes.MapRoute(
    "TestRoute", 
    "Home/Testing/{id}", 
    new { controller = "Home", action = "Testing", id = 0, MyString = UrlParameter.Optional } 
); 

これはポストはこれを生成します完璧に良い。 私はそれを試して、うまくいった。

Priyankも、私はあなたが多分カスタムValueProviderでこれを解決することができますが、あなたはそれがあなたに適用される何かがあるかどうかを確認するために彼のリンク先の記事自分に従わなければならないことは、上記リンクSOの記事で言及しました。

関連する問題