13

Ho lavorato a un'applicazione MVC di grandi dimensioni negli ultimi mesi o giù di lì, ma questa è la prima volta che ho bisogno di definire un gestore di route personalizzato e sto riscontrando alcuni problemi. Fondamentalmente ho due parametri da passare. Il primo è richiesto e il secondo è facoltativo.Routing ASP.NET MVC con un parametro obbligatorio e un parametro facoltativo?

Sto seguendo questa risposta here.

Ecco il mio percorso personalizzato:

routes.MapRoute(
    "MyRoute", 
    "{controller}/{action}/{param1}/{param2}", 
    new { 
     controller = "MyController", 
     action = "MyAction", 
     param1 = "", 
     param2 = "" // I have also tried "UrlParameter.Optional" here. 
    } 
); 

E il mio metodo di azione firma:

public ActionResult MyAction(string param1, string param2) 

Se provo l'URL http://[myserver]/MyController/MyAction/Test1/Test2 allora funziona come mi aspetto che, con param1 = "Test1 "e param2 =" Test2 "

Se provo l'URL http://[myserver]/MyController/MyAction/Test1, entrambi i parametri sono nulli.

Speriamo che qualcuno possa dirmi cosa sto facendo male qui, perché sono perso.

+0

Hi dal futuro - provare attribuire instradamento ora - WAY modo più semplice e meno incline agli errori. – niico

risposta

13

Presumo che si è creato nuovo percorso e lasciato quello di default che è molto simile al tuo. È necessario essere consapevoli del fatto che la raccolta di rotte viene attraversata per trovare il primo percorso di corrispondenza. Quindi, se avete lasciato quello di default:

routes.MapRoute(
      "Default", // Route name 
      "{controller}/{action}/{id}", // URL with parameters 
      new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults 
     ); 

sopra l'itinerario allora corrisponderà richiesta di http://[myserver]/My/MyAction/Test1 e chiamare MyController.MyAction e impostare "Text1" per il parametro di nome id. Quale non riuscirà perché questa azione non sta dichiarando uno chiamato id.

Quello che dovete fare è di spostare il percorso come prima in elenco rotte e renderlo più preciso, allora è ora:

routes.MapRoute(
      "Route", 
      "My/{action}/{param1}/{param2}", 
      new 
      { 
       controller = "My", 
       action = "MyAction", 
       param1 = "", 
       param2 = "" 
      }); 

Questo costringerà tutto il traffico instradato attraverso My a corrispondere a questo percorso.

+1

Non importa cosa faccio Non riesco a far funzionare più parametri nel percorso come questo. Se provo a creare 2 parametri e richiedo la pagina con un URL come "My/MyAction/param1/param2', ottengo un errore 404. Che cosa sto facendo di sbagliato? – DavidHyogo

1

hi te Crea il tuo rotta in questo modo credo che questo sarà hep si

routes.MapRoute(
       "Regis", // Route nameRegister 
       "Artical/{id}", // URL with parameters 
       new { controller = "Artical", action = "Show", id = UrlParameter.Optional } // Parameter defaults 
      ); 
0

Prova questa

routes.MapRoute("MyRoute", 
       "myRoute/{param1 }/{param2 }", 
       new { controller = "MyController", action = "MyAction", param2 = UrlParameter.Optional }, 
       new { param2 = @"\w+" }); 

è possibile specificare un parametro come optional utilizzando "UrlParameter.Optional" e specificato seconda con tipo di dati significa che se si passa valore intero poi DataType (@ "\ d +") e per lo spago ho menzionato sopra.

NOTA: sequenza del parametro è molto importante Parametro opzionale deve passare finalmente e registrare il nuovo percorso prima percorso predefinito In Gloab.asax.

allora azione di collegamento come

<a href="@Url.RouteUrl("MyRoute", new { param2 = "Test1",param1 = "Test2"})">Test</a> 

O con un parametro

<a href="@Url.RouteUrl("MyRoute", new { param2 = "Test1"})">Test</a> 

In te controller

public ActionResult MyAction(string param2,string param1) 
{ 
    return View() 
} 
Problemi correlati