ASP.Net MVC:使用RedirectToAction()将字符串参数传递给操作

时间:2012-02-03 03:12:49

标签: asp.net-mvc-3 url routing redirect url-encoding

我想知道如何使用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,但是,我仍然很想知道如何让代码在上面工作,只是为了满足我的好奇心。

2 个答案:

答案 0 :(得分:2)

我认为问题可能在您的路线订单中,也可能在您的控制器中。这是我开始工作的一些代码。

路线定义

        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”输出。你能发布你的路线和你的控制器代码吗?

答案 1 :(得分:2)

好的,我知道这个问题已经有几天了,但我不确定你是否对这个问题进行了分类,所以我看了一下。我现在玩了一段时间,这就是问题所在以及如何解决它。

您遇到的问题是导致问题的特殊字符是众多(我认为是20个)特殊字符之一,例如%和“。

在您的示例中,问题是%字符。 正如Priyank here所指出的那样:

  

路线值将作为URL字符串的一部分发布。

Url字符串(不是查询字符串参数)无法处理%(%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来解决这个问题,但你必须按照他的链接文章来检查它是否适用给你。