2012-02-03 64 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)編碼它無濟於事。

於是我使出我們TempData的傳遞someString,不過,我會很好奇地想知道如何使上述工作的代碼,只是爲了滿足我的好奇心。

+0

您是否嘗試在'web.config'中更改'relaxedUrlToFileSystemMapping'和'requestPathInvalidCharacters'? – 2012-02-03 03:26:54

+0

@EricYin不,我沒有。我不知道這兩個參數。我會研究他們。 – 2012-02-03 17:46:01

回答

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」在我的瀏覽器所需的輸出輸出。你可以發佈你的路線和你的Controller代碼嗎?

+2

我的代碼適用於MyString =「Hello」。問題在於特殊字符。試試MyString =「!@#$%?&* 1」,你會明白我的意思。 – 2012-02-03 17:47:39

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 - (這將炸燬)

之一來解決這個的一種方法是從路由映射除去{MyString}。爲了使您的根映射是這樣的:

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

這將導致後,產生這樣的:

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

現在,當你設置MyString它會變成一個查詢字符串參數,它的工作原理非常好。 我確實嘗試過,它確實有效。

Priyank在SO後我上面鏈接,你也許可以用自定義ValueProvider解決這個問題,但你將不得不跟隨他的鏈接的文章他們來檢查,如果這是一個適用於你的東西也被提及。

相關問題