Comment créer une contrainte de route de type System.Guid?

Quelqu’un peut-il me diriger dans la bonne direction sur la façon de cartographier un itinéraire qui nécessite deux guids?

c’est à dire. http://blah.com/somecontroller/someaction/ {firstGuid} / {secondGuid}

où firstGuid et secondGuid ne sont pas facultatifs et doivent être de type system.Guid?

Créez une RouteConstraint comme suit:

public class GuidConstraint : IRouteConstraint { public bool Match(HttpContextBase httpContext, Route route, ssortingng parameterName, RouteValueDictionary values, RouteDirection routeDirection) { if (values.ContainsKey(parameterName)) { ssortingng ssortingngValue = values[parameterName] as ssortingng; if (!ssortingng.IsNullOrEmpty(ssortingngValue)) { Guid guidValue; return Guid.TryParse(ssortingngValue, out guidValue) && (guidValue != Guid.Empty); } } return false; }} 

Suivant lors de l’ajout de l’itinéraire:

 routes.MapRoute("doubleGuid", "{controller}/{action}/{guid1}/{guid2}", new { controller = "YourController", action = "YourAction" }, new { guid1 = new GuidConstraint(), guid2 = new GuidConstraint() }); 

Pour MVC 5 , la classe GuidRouteConstraint est déjà implémentée:
https://msdn.microsoft.com/en-us/library/system.web.mvc.routing.constraints.guidrouteconstraint(v=vs.118).aspx

Liste complète des contraintes MVC disponibles:
https://msdn.microsoft.com/en-us/library/system.web.mvc.routing.constraints (v = vs.118) .

Si vous utilisez le code de kazimanzurrashid, veillez à inclure le commentaire de Nikos D. J’ai fini avec ça:

 public class NonEmptyGuidRouteConstraint : IRouteConstraint { public bool Match(HttpContextBase httpContext, Route route, ssortingng parameterName, RouteValueDictionary values, RouteDirection routeDirection) { if (values.ContainsKey(parameterName)) { var guid = values[parameterName] as Guid?; if (!guid.HasValue) { var ssortingngValue = values[parameterName] as ssortingng; if (!ssortingng.IsNullOrWhiteSpace(ssortingngValue)) { Guid parsedGuid; Guid.TryParse(ssortingngValue, out parsedGuid); guid = parsedGuid; } } return (guid.HasValue && guid.Value != Guid.Empty); } return false; } } 

Méfiez-vous du code donné par @kazimanzurrashid. C’était un bon début, mais il a certainement un bug ou trop. Je passais un vrai Guid dans les valeurs de l’itinéraire (au lieu d’une chaîne de Guid), et je ne pouvais rien obtenir qui corresponde à mon itinéraire. Il m’a fallu une éternité pour me rendre compte que la GuidConstraint se heurtait à un vrai Guid , si cela avait du sens. 🙂

Voici ce que j’ai fini avec, qui accepte n’importe quel type de données (pas seulement une chaîne), qui est un peu plus rapide (je pense) et qui contient moins d’imbrication de bloc .

 public class GuidConstraint : IRouteConstraint { public bool Match(HttpContextBase httpContext, Route route, ssortingng parameterName, RouteValueDictionary values, RouteDirection routeDirection) { object value; if (!values.TryGetValue(parameterName, out value)) return false; if (value is Guid) return true; var ssortingngValue = Convert.ToSsortingng(value); if (ssortingng.IsNullOrWhiteSpace(ssortingngValue)) return false; Guid guidValue; if (!Guid.TryParse(ssortingngValue, out guidValue)) return false; if (guidValue == Guid.Empty) return false; return true; } } 

+1 @kazimanzurrashid. Semble sur place.

Je vais donner une alternative pour ceux qui n’ont pas C # 4.0, dont fait partie Guid.TryParse . Il y a une autre alternative avec Regex mais ça ne vaut probablement pas la peine.

  public class GuidConstraint : IRouteConstraint { public bool Match(HttpContextBase httpContext, Route route, ssortingng parameterName, RouteValueDictionary values, RouteDirection routeDirection) { if (values.ContainsKey(parameterName)) { ssortingng ssortingngValue = values[parameterName] as ssortingng; if (!ssortingng.IsNullOrEmpty(ssortingngValue)) { //replace with Guid.TryParse when available. try { Guid guid = new Guid(ssortingngValue); return true; } catch { return false; } } } return false; } } 

J’ai trouvé que le fait de supposer que le type est un guide entraîne des problèmes lors de l’utilisation de choses comme @ Html.RouteLink (…) et dans les tests de routage où l’URL est fournie sous forme de chaîne. Le code ci-dessous répond à ces situations. En utilisant les exemples de code ci-dessus provoqué des problèmes dans mes vues et / ou tests, ceci fonctionne bien.

  public class GuidConstraint : IRouteConstraint { public bool Match(HttpContextBase httpContext, Route route, ssortingng parameterName, RouteValueDictionary values, RouteDirection routeDirection) { var value = values[parameterName]; if (value == null) return false; var ssortingngValue = value.ToSsortingng(); if (ssortingng.IsNullOrEmpty(ssortingngValue)) return false; Guid guidValue; return Guid.TryParse(ssortingngValue, out guidValue) && (guidValue != Guid.Empty); } }