2012-02-03 26 views
9

Vorrei sapere come passare un parametro stringa utilizzando RedirectToAction().ASP.Net MVC: passaggio di un parametro stringa a un'azione utilizzando RedirectToAction()

Diciamo che ho questo percorso:

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

E in SomeController, ho un'azione facendo un reindirizzamento come segue:!

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

ho provato questo reindirizzamento con someString =" @ # $%? & * 1 "e fallisce sempre, non importa se codifico la stringa. Ho provato a codificarlo con HttpUtility.UrlEncode (someString), HttpUtility.UrlPathEncode (someString) e con Uri.EscapeUriString (someString) senza alcun risultato.

Così ho fatto ricorso a TempData per passare un po 'di stringa, ma comunque sarei curioso di sapere come far funzionare il codice sopra, solo per soddisfare la mia curiosità.

+0

Hai provato a cambiare 'relaxedUrlToFileSystemMapping' e' requestPathInvalidCharacters' in 'web.config'? –

+0

@EricYin No, non l'ho fatto. Non ero a conoscenza di questi due parametri. Li esaminerò. –

risposta

3

Penso che il problema potrebbe essere nell'ordine del percorso o nel controller. Ecco un codice che ho avuto modo di lavorare.

rotta Definizioni

 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 

Metodi azione di controllo

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

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

Quando si naviga a /Home/MoreTesting ho l'output desiderato di "23Hello" di uscita nel browser. Puoi pubblicare i tuoi percorsi e il tuo codice di controllo?

+2

Il mio codice funzionerebbe con MyString = "Ciao". Il problema è con caratteri speciali. Prova con MyString = "! @ # $%? & * 1", vedrai cosa intendo. –

2

OK, so che questa domanda è vecchia di alcuni giorni ma non ero sicuro se avessi risolto questo problema o meno così ho dato un'occhiata. Ho giocato con questo per un po 'di tempo e questo è il problema e come potresti risolverlo.

Il problema riscontrato è che le questioni i caratteri speciali che causano sono uno dei tanti (credo 20) i caratteri speciali, come ad esempio% e".

Nel tuo esempio il problema è il carattere%. come sottolineato da Priyankhere:

I valori di percorso sono pubblicati come parte della stringa URL

la stringa URL (non string query paramete. r) non può gestire% (% 25), "(% 22) e così via. Inoltre, come sottolineato da Lee Gunn nello stesso posto: http://localhost:1423/Home/Testing/23/!%40%23%24%25%3f%26 *% 201 - (questo farà saltare in aria)

Uno dei modi per risolvere questo è quello di rimuovere {MyString} dalla mappatura del percorso.Per rendere il vostro mappatura radice simile a questa:

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

questo farà sì che il palo di generare questo:

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

Ora, quando si imposta MyString sarà trasformato in un parametro di stringa di query che funziona perfettamente bene. L'ho provato e ha funzionato.

Priyank menzionato anche nel post SO ho linkato sopra che forse potrebbe risolvere questo problema con un costume ValueProvider ma si dovrà seguire il suo articolo collegato loro per verificare se questo è qualcosa che si applicherebbe a voi.

Problemi correlati