ASP.Net MVC: передача строкового параметра в действие с помощью RedirectToAction () - PullRequest
9 голосов
/ 03 февраля 2012

Я хотел бы знать, как передать параметр строки с помощью 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 ]

2 голосов
/ 08 февраля 2012

Ладно, я знаю, что этому вопросу несколько дней, но я не был уверен, разобрали ли вы эту проблему или нет, поэтому я посмотрел.Я поэкспериментировал с этим некоторое время, и вот в чем проблема, и как вы можете ее решить.

Проблема, с которой вы сталкиваетесь, заключается в том, что специальные символы, вызывающие проблемы, являются одними из многих (я думаю, 20) специальные символы, такие как% и ".

В вашем примере проблема заключается в символе%. Как указано Priyank здесь :

Значения маршрута публикуются как часть строки 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 itбудет превращен в параметр строки запроса, который прекрасно работает. Я попробовал это, и это сработало.

Priyank также упоминалось в посте SO, который я привел выше, что вы, возможно, можете решить эту проблему с помощью пользовательского ValueProvider, но вам придетсяследуйте его связанной статье, чтобы проверить, относится ли это к вам.

2 голосов
/ 03 февраля 2012

Я думаю, что проблема может быть либо в вашем порядке маршрута, либо в вашем контроллере. Вот некоторый код, который я получил для работы.

Определения маршрутов

        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" для вывода в браузере Можете ли вы опубликовать свои маршруты и код вашего контроллера?

...