13

Ich habe in den letzten Monaten an einer großen MVC-Anwendung gearbeitet, aber dies ist das erste Mal, dass ich einen benutzerdefinierten Routen-Handler definieren musste, und ich stoße auf einige Probleme. Grundsätzlich muss ich zwei Parameter übergeben. Der erste ist erforderlich und der zweite ist optional.ASP.NET MVC-Routing mit einem obligatorischen Parameter und einem optionalen Parameter?

Ich befolge diese Antwort here.

Hier ist meine individuelle Route:

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

Und meine Aktionsmethode Signatur:

public ActionResult MyAction(string param1, string param2) 

Wenn ich die URL versuchen http://[myserver]/MyController/MyAction/Test1/Test2 dann funktioniert es, wie ich es zu, mit param1 = „Test1 erwarten "und param2 =" Test2 "

Wenn ich die URL http://[myserver]/MyController/MyAction/Test1 versuche, dann sind beide Parameter null.

Hoffentlich kann mir jemand sagen, was ich falsch mache, weil ich verloren bin.

+0

Hallo aus der Zukunft - versuchen nun Routing-Attribut - WEGE WAY einfacher und weniger fehleranfällig. – niico

Antwort

13

Ich gehe davon aus, dass Sie neue Route erstellt und verließen den Standard eine, die Sie sehr ähnlich ist. Sie sollten wissen, dass die Sammlung von Routen durchlaufen wird, um die erste übereinstimmende Route zu finden. Also, wenn Sie die eine Standard verlassen haben:

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

über die Route dann wird es Anforderung an http://[myserver]/My/MyAction/Test1 entsprechen und rufen MyController.MyAction und setzen Sie „Text1“ zu id Parameter genannt. Dies wird fehlschlagen, weil diese Aktion keinen Namen namens id deklariert.

Was Sie tun müssen, ist Ihre Route als erste in Routenliste zu bewegen und machen es spezifischere dann ist es jetzt:

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

Dieser gesamte Verkehr Trog geführt zwingt My diesen Weg zu entsprechen.

+1

Egal, was ich tue, ich kann nicht mehrere Parameter erhalten, um so im Pfad zu arbeiten. Wenn ich versuche, 2 Parameter zu erstellen und die Seite mit einer URL wie 'My/MyAction/param1/param2' anzufordern, bekomme ich einen 404 Fehler. Was mache ich falsch? – DavidHyogo

1

hallo Sie erstellen Ihren Router wie dies ich denke, das Sie hep

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

Versuchen diese

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

man einen Parameter als optional unter Verwendung von „UrlParameter.Optional“ angeben können, und spezifiziert zweite mit Datatype bedeutet, wenn Sie ganzzahligen Wert dann Datatype (@ „\ d +“) passieren und für String habe ich oben erwähnt.

HINWEIS: Reihenfolge der Parameter ist sehr wichtig Optional Parameter zuletzt passieren muss und registrieren Sie Ihre neue Route vor dem Standard-Route In Gloab.asax.

dann Sie Aktionslink wie

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

OR mit einem Parameter

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

In Ihrem Controller-

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