Ändern Sie RouteValueDictionary dynamisch

Als eine Fortsetzung vondiese FrageIch versuche, eine benutzerdefinierte Routenbeschränkung zu implementieren, um die dynamisch zu ändernRouteValueDictionary für eine bestimmte Route.

Ich bin zu 95% auf dem Weg dorthin: Ich kann jede Route anhand des bereitgestellten Parametermusters mit der in der URL angegebenen Aktion abgleichen. Der allerletzte Schritt dieses Prozesses besteht darin, das RouteValueDictionary zu überschreiben, um die Schlüssel als geeignete Parameter für die Controller-Aktion umzubenennen.

Hier ist der relevante Ausschnitt aus meinem Code (die gesamte Klasse besteht aus fast 300 Zeilen, daher möchte ich nicht alles hinzufügen, kann es aber bei Bedarf):

public class CustomRouteConstraint : IRouteConstraint
{
    public bool Match(HttpContextBase httpContext, Route route, string paramName, RouteValueDictionary values, RouteDirection routeDirection)
    {
        if (routeDirection.Equals(RouteDirection.UrlGeneration)) {
            return false;
        }

        //this will grab all of the "actual" parameters out of the RVD, excluding action and controller 
        Dictionary<string, object> unMappedList = values.Where(x => x.Key.Contains("param")).OrderBy(xi => xi.Key).ToDictionary(
            kvp => kvp.Key, kvp => kvp.Value);

        string controller = values["controller"] as string;
        string action = values["action"] as string;

        //this method tries to find the controller using reflection
        Type cont = TryFindController(controller);

        if (cont != null) {
            MethodInfo actionMethod = cont.GetMethod(action);

            if (actionMethod != null) {
                ParameterInfo[] methodParameters = actionMethod.GetParameters();

                //this method validates that the parameters of the action that was found match the expected parameters passed in the custom constraint; it also performs type conversion
                if (validateParameters(methodParameters, unMappedList)) {
                    for (int i = 0; i < methodParameters.Length; i++) {
                        values.First(x => x.Key == unMappedList.ElementAt(i).Key).Key = methodParameters.ElementAt(i).Name; 
                        //above doesn't work, but even if it did it wouldn't do the right thing

                        return true;
                    }
                }
            }
        }

        return false;
    }
}

Und so verwende ich die benutzerdefinierte Einschränkung:

routes.MapRoute(
    name: "Default2",
    url: "{controller}/{action}/{param1}-{param2}",
    defaults: new { controller = "Admin", action = "Index" },
    constraints: new { lang = new CustomRouteConstraint(new RoutePatternCollection( new List<ParamType> { ParamType.INT, ParamType.INT })) }
);

(Was ich in den Konstruktor übergebe, ist im Grunde gesagt: "Das zu suchende Parametermuster sind zwei Ganzzahlen."Match Wenn die Methode aufgerufen wird, wird true zurückgegeben, wenn die in der URL angegebene Aktion unabhängig von den tatsächlichen Parameternamen zwei ganzzahlige Parameter enthält.)

Gibt es eine Möglichkeit, das RouteValueDictionary für diese Anforderung zu überschreiben? Oder kann ich das auf eine andere Weise tun, die mir fehlt?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage