2017-05-26 5 views
0

Ich schreibe eine MVC-Anwendung mit MVC-Bereichen. Derzeit verwenden wir die folgende Route für unseren Anzeigebereich:Gibt es eine Begrenzung für die Anzahl der Parameter, die eine MVC-Route verarbeiten kann?

public override void RegisterArea(AreaRegistrationContext context) 
{ 
    context.MapRoute(
     "Display_default", 
     "Display/{controller}/{action}/{id}/{id2}/{id3}/{*id4}", 
     new { action = "Index", id = UrlParameter.Optional , id2 = UrlParameter.Optional, id3 = UrlParameter.Optional } 
    ); 
} 

Und das funktioniert. Allerdings entdeckten wir die Notwendigkeit für eine Controller-Aktion mit 6 Parametern:

public ActionResult _MyMethod(string id, string id2, string id3, string id4, string id5, string id6) 

wir entdeckten wir dieses wir die aktuellen Einstellungen hinzufügen können jedoch beliebige Parameter in der URL nach dem her ist id gerade in die 4. id Parameter verkettet.

Wir haben versucht, die Strecke zu verlängern, die Anzahl der Parameter zu akzeptieren, dass wir wie so benötigt:

public override void RegisterArea(AreaRegistrationContext context) 
{ 
    context.MapRoute(
     "Display_default", 
     "Display/{controller}/{action}/{id}/{id2}/{id3}/{id4}/{id5}/{*id6}", 
     new { action = "Index", id = UrlParameter.Optional , id2 = UrlParameter.Optional, id3 = UrlParameter.Optional } 
    ); 
} 

jedoch diesen Weg mit der Seite nicht mehr Lasten.

Hat MVC Routing eine Art CAP bezüglich der Anzahl der Parameter, denen es zugeordnet werden kann? Wir haben auch entdeckt, dass wenn wir die Anzahl der gemappten Parameter auf id, id2 und id3 verkleinern, es aber wieder mit allen Überläufen funktioniert, die zu id3 verkettet werden.

Hat jemand irgendwelche Informationen dazu?

+0

Sie so viele haben, wie Sie (bis zu dem Punkt, an dem Sie die Query-String-Grenze überschreiten würde und eine Ausnahme auslösen) wollen . Aber nur der letzte Parameter kann als 'UrlParameter.Optional' markiert werden. –

+0

Ok, also in meinem Fall oben, warum würde es nicht die 6 Parameter erlauben, die ich brauche? –

+0

Haben Sie alle 'UrlParameter.Optional' entfernt. Und warum hast du den 6. mit '{* id6}' markiert? –

Antwort

1

ASP.NET MCV hat keine Begrenzung für die Anzahl der Parameter.

In Ihrem Fall

public override void RegisterArea(AreaRegistrationContext context) 
{ 
    context.MapRoute(
     "Display_default", 
     "Display/{controller}/{action}/{id}/{id2}/{id3}/{id4}/{id5}/{*id6}", 
     new { action = "Index", id = UrlParameter.Optional , id2 = UrlParameter.Optional, id3 = UrlParameter.Optional } 
    ); 
} 

Variable id ist optional aber id4 obligatorisch ist. Sie müssen optionale Parameter am Ende hinzufügen.

Wie

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

oder alle Parameter machen optional

routes.MapRoute(
     name: "Default", 
     url: "{controller}/{action}/{id}/{id2}/{id3}/{id4}/{id5}/{*id6}", 
      defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional, id2 = UrlParameter.Optional, id3 = UrlParameter.Optional, id4 = UrlParameter.Optional, id5 = UrlParameter.Optional } 
); 
+0

Nur der letzte Parameter kann als 'UrlParameter.Optional' markiert werden. –

+0

@Stephen Mücke Warum denkst du das? Dieser Code funktioniert gut für mich, haben Sie irgendwelche Unterlagen? Ich habe den Call-Stack "routes.MapRoute" untersucht, den ich in der Methode "ParsedRoute.Matched" abgeschlossen habe http://www.dotnetframework.org/default.aspx/[email protected]/[email protected]/DEVDIV_TFS/Dev10/Releases/RTMRel/ndp/fx/src/xsp/System/Web/Routing/ParsedRoute @ cs/1305376/ParsedRoute @ cs Zeile 518 gibt es keinen Beweis, dass nur ein Parameter als 'UrlParameter.Optional' markiert werden konnte. –

+0

Da, wenn Sie nicht alle bereitstellen, das Routing-Modul keine Möglichkeit hat zu wissen, welches das ist und daher eine Abfragezeichenfolge verwendet, keine Routenwerte (wodurch die Routendefinition sinnlos wird) –

Verwandte Themen