So ermitteln Sie, ob eine beliebige URL mit einer definierten Route übereinstimmt

Wie kann ich feststellen, ob eine Zeichenfolge mit einer bestimmten benannten Route übereinstimmt?

Ich habe eine Route wie diese:

routes.MapRoute( "FindYourNewRental", "find-your-new-rental/{market}/{community}.html", new { controller = "FindYourNewRental", action = "Community" } ); string url = "http://www.website.com/find-your-new-rental/northerncalifornia/sacramento.html" 

Wie kann ich programmgesteuert mitteilen, ob die URL-Zeichenfolge mit dieser Route übereinstimmt? Etwas wie das:

 // matches url with the named route "FindYourNewRental" if (IsRouteMatch(url, "FindYourNewRental")) { // do something } public bool IsRouteMatch(string url, string routeName) { // How do I code this function } 

Ich triggerse das, indem ich eine benutzerdefinierte RouteInfo-class hinzufügte, die einen neuen HttpContext mit der angegebenen URL und dem angegebenen Anwendungspfad erstellt und damit eine Instanz von RouteData basierend auf dem neuen HttpContext-Objekt abruft. Ich kann dann die Controller- und Action-Werte auswerten, um zu sehen, welche Route gefunden wurde. Ich habe dies mit einer Erweiterungsmethode für die Uri-class verdrahtet. Es fühlt sich ein bisschen hackisch an und ich hatte gehofft, dass es einen saubereren Weg gibt, dies zu tun, also werde ich die Frage offen lassen, falls jemand anders eine bessere Lösung hat.

ROUTEINFO KLASSE:

 public class RouteInfo { public RouteInfo(RouteData data) { RouteData = data; } public RouteInfo(Uri uri, string applicationPath) { RouteData = RouteTable.Routes.GetRouteData(new InternalHttpContext(uri, applicationPath)); } public RouteData RouteData { get; private set; } private class InternalHttpContext : HttpContextBase { private readonly HttpRequestBase _request; public InternalHttpContext(Uri uri, string applicationPath) : base() { _request = new InternalRequestContext(uri, applicationPath); } public override HttpRequestBase Request { get { return _request; } } } private class InternalRequestContext : HttpRequestBase { private readonly string _appRelativePath; private readonly string _pathInfo; public InternalRequestContext(Uri uri, string applicationPath) : base() { _pathInfo = ""; //uri.Query; (this was causing problems, see comments - Stuart) if (String.IsNullOrEmpty(applicationPath) || !uri.AbsolutePath.StartsWith(applicationPath, StringComparison.OrdinalIgnoreCase)) _appRelativePath = uri.AbsolutePath; else _appRelativePath = uri.AbsolutePath.Substring(applicationPath.Length); } public override string AppRelativeCurrentExecutionFilePath { get { return String.Concat("~", _appRelativePath); } } public override string PathInfo { get { return _pathInfo; } } } } 

URI-Verlängerungsmethode:

  ///  /// Extension methods for the Uri class ///  public static class UriExtensions { ///  /// Indicates whether the supplied url matches the specified controller and action values based on the MVC routing table defined in global.asax. ///  /// A Uri object containing the url to evaluate /// The name of the controller class to match /// The name of the action method to match /// True if the supplied url is mapped to the supplied controller class and action method, false otherwise. public static bool IsRouteMatch(this Uri uri, string controllerName, string actionName) { RouteInfo routeInfo = new RouteInfo(uri, HttpContext.Current.Request.ApplicationPath); return (routeInfo.RouteData.Values["controller"].ToString() == controllerName && routeInfo.RouteData.Values["action"].ToString() == actionName); } } 

VERWENDUNGSZWECK:

 Uri url = new Uri("http://www.website.com/find-your-new-rental/northerncalifornia/sacramento.html"); if (url.IsRouteMatch("FindYourNewRental", "Community")) { // do something } 

ODER

 if (Request.Url.IsRouteMatch("FindYourNewRental", "Community")) { // do something } 

HINZUGEFÜGTER BONUS: Da die RouteInfo-class mir eine Instanz von RouteData zurückgibt, kann ich auch auf die Routenparameter zugreifen. Dies führte zur Erstellung einer anderen Uri-Erweiterungsmethode:

 public static string GetRouteParameterValue(this Uri uri, string paramaterName) { RouteInfo routeInfo = new RouteInfo(uri, HttpContext.Current.Request.ApplicationPath); return routeInfo.RouteData.Values[paramaterName] != null ? routeInfo.RouteData.Values[paramaterName].ToString() : null; } 

Welches kann jetzt so verwendet werden:

 string someValue = url.GetRouteParameterValue("ParameterName");