3

Ich stieß auf ein Szenario, wo ich die Standard-MVC Route-Setup hatte. Wie So.MVC Routing Parameter Vorrang

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

navigiert dann zu einer URL als solche

domain/controller/action/1234 

Auf dieser Seite habe ich dann auf die gleiche Seite wurde die Navigation aber mit unterschiedlichen Parametern nach einem bestimmten Ereignis. Wie so.

Ich bemerkte, dass die URL immer noch die gleiche ID in der URL und Befestigung Parameter wie so.

domain/controller/action/1234?id=4321&vrnsearch=true 

Nun meine Frage ist, gibt es eine Möglichkeit, einen Vorrang vor, um zu bestimmen, ob sie den Wert für ID aus der URL oder aus dem Parameter verwenden sollen.

Ich habe tatsächlich eine Arbeit um/Problem für mein Problem gefunden, indem Sie die unten, die die ID aus der URL entfernt und verwendet nur Parameter verwendet.

Allerdings war nur neugierig, ob es einen Vorrang in den Parametern vs URL-Routing gibt.

Antwort

5

Die Abfragezeichenfolge hat überhaupt nichts mit dem Routing zu tun (zumindest nicht, wenn Sie das Routing nicht anpassen, um dies zu berücksichtigen).

Die Werte, die an den ModelBinder und Ihre Aktion-Methode übergeben werden, werden so durch Wert Provider erfolgen. Sie können die Rangfolge steuern, indem Sie die Reihenfolge ändern, in der die entsprechende ValueProviderFactory in der statischen Eigenschaft ValueProviderFactories.Factories registriert ist.

enter image description here

Wie Sie sehen können, ist die Standardkonfiguration zuerst die RouteDataValueProviderFactory zu verwenden, und wenn es keinen Wert zurückgibt wird es die QueryStringValueProviderFactory versuchen. Wenn Sie die Reihenfolge der Fabriken ändern, ändert sich die Rangfolge.

ValueProviderFactories.Factories.RemoveAt(3); 
ValueProviderFactories.Factories.Insert(4, new RouteDataValueProviderFactory());