2016-06-03 27 views
5

Sto tentando di seguire una convenzione utilizzata da molti siti che passano in argomenti con più barre in avanti, invece di utilizzare il modello GET.ASP.NET MVC 4 Parametri separati da barre in avanti "/" non passando correttamente args

Cioè, sto cercando di consumare un URL del tipo:

http://www.foo.bar/controller/action?arg1=a&arg2=b&arg3=c 

in questo modo:

http://www.foo.bar/controller/action/a/b/c 

Io attualmente ho questo (per lo più) di lavoro, utilizzando il seguente:

public static void RegisterRoutes(RouteCollection routes) { 
     routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

     routes.MapRoute(
      name: "Default", 
      url: "{controller}/{action}/{id}", 
      defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
     ); 

     routes.MapRoute(
      name: "Sandbox", 
      url: "Sandbox/{action}/{*args}", 
      defaults: new { controller = "Sandbox", action = "Index", args = UrlParameter.Optional } 

     ); 
    } 

Tuttavia, se passo in qualcosa come

http://www.foo.bar/Sandbox/Index/a 

o

http://www.foo.bar/Sandbox/Index/a/ 

Il controllore e azione sono opportunamente chiamati:

public ActionResult Index(string args) 
{ 
    return View(); 
} 

ma args è nullo.

Tuttavia, se mi passate in qualcosa di simile:

http://www.foo.bar.com/Sandbox/Index/a/b 

Poi args è "A/B", se lo desideri.

Ho setacciato SO e il resto del web, ma non riesco a trovare la soluzione.

C'è qualcosa di ovvio che mi manca per correggere questo comportamento?

Sto cercando la terminologia sbagliata?

Nota: sono stato in grado di riprodurre questo problema con una nuovissima applicazione ASP.NET utilizzando l'autenticazione di Windows. Tutto ciò che è stato fatto:

  1. Creare un'applicazione ASP.NET in VS 2015
  2. Scegli MVC
  3. Clicca sui cambiamenti Autenticazione
  4. Selezionare Windows
  5. Aggiungere quanto sopra mappa del percorso per RouteConfig.cs
  6. Creare SandboxController.cs e aggiungere il parametro args all'indice
  7. Creare la vista Index.cshtml
  8. Repro il problema utilizzando http://localhost:55383/Sandbox/Index/a
  9. Repro il comportamento previsto utilizzando http://localhost:55383/Sandbox/Index/a/b

Qualsiasi aiuto è molto apprezzato. Grazie! Domanda simile, ma non mi aiuta: URLs with slash in parameter?

+1

mostrare tutti i tuoi percorsi e l'ordine –

+0

Sì. L'ho aggiunto. E mi sento piuttosto stupido adesso. Mi resi conto che il Default veniva chiamato per primo. – Thumper

risposta

3

Non importa ... Ecco il problema ...

MapRoute chiama prima la route predefinita. Per risolvere il problema, ho semplicemente invertito la rotta della mappa predefinita con la rotta Sandbox.

Spero che questo aiuti qualcuno.

soluzione di lavoro: (? Avete anche il percorso di default)

public class RouteConfig { 
    public static void RegisterRoutes(RouteCollection routes) { 
     routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

     routes.MapRoute(
      name: "Sandbox", 
      url: "Sandbox/{action}/{*args}", 
      defaults: new { controller = "Sandbox", action = "Index", args = UrlParameter.Optional } 

     ); 

     routes.MapRoute(
      name: "Default", 
      url: "{controller}/{action}/{id}", 
      defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
     ); 


    } 
}