ASP.Net MVC: Passando um parâmetro de string para uma ação usando RedirectToAction ()

10

Eu gostaria de saber como passar um parâmetro de string usando RedirectToAction ().

Digamos que eu tenha esse caminho:

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

E em SomeController, eu tenho uma ação fazendo um redirecionamento da seguinte forma:

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

Eu tentei esse redirecionamento com someString="! @ # $%? & amp; 1" e ele sempre falha, não importa se eu codifique a string. Eu tentei codificá-lo com HttpUtility.UrlEncode (someString), HttpUtility.UrlPathEncode (someString) e com Uri.EscapeUriString (someString) sem sucesso.

Então eu recorri a nós TempData para passar um pouco de string, mas ainda assim, eu estaria curioso para saber como fazer o código acima do trabalho, apenas para satisfazer a minha curiosidade.

    
por Jean-François Beauchamp 03.02.2012 в 04:12
fonte

2 respostas

3

Acho que o problema pode estar na sua ordem de rota ou no seu controlador. Aqui está algum código que eu comecei a trabalhar.

Definições de rota

        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

Métodos de ação do controlador

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

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

Quando eu navego para /Home/MoreTesting , obtenho a saída desejada de "23Hello" para exibir no meu navegador. Você pode postar suas rotas e seu código de controlador?

    
por user596075 03.02.2012 / 04:24
fonte
2

OK, eu sei que essa pergunta tem alguns dias, mas eu não tinha certeza se você resolveu ou não o problema, então eu dei uma olhada. Eu brinquei com isso por um tempo agora e é isso que o problema é e como você pode resolvê-lo.

O problema que você está tendo é que os caracteres especiais que causam problemas são um dos muitos (acho que 20) caracteres especiais, como% e ".

No seu exemplo, o problema é o caractere%. Como apontado por Priyank aqui :

  

Os valores da rota são postados como parte da string da URL.

A cadeia URL (não o parâmetro da string de consulta) não pode manipular% (% 25), "(% 22) e assim por diante. Além disso, como apontado por Lee Gunn no mesmo post: link *% 201 - (isso explodirá)

Uma das maneiras de corrigir isso é remover {MyString} do mapeamento de rota. Para fazer o seu mapeamento de raiz ficar assim:

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

Isso fará com que a postagem gere isso:

link

Agora, quando você definir MyString , ele será transformado em um parâmetro de string de consulta que funciona perfeitamente bem. Eu tentei isso e funcionou.

Priyank também mencionou no post do SO que eu fiz um link acima que você poderia resolver isso com um ValueProvider personalizado, mas você teria que seguir o artigo dele para verificar se isso é algo que se aplica a você. / p>     

por Fran 23.05.2017 / 14:08
fonte