Méfiez-vous du code donné par @kazimanzurrashid. C'était un bon début, mais il a certainement un bug ou aussi. Je passais un vrai Guid dans les valeurs de route (au lieu d'une chaîne de Guid), et je ne pouvais rien obtenir pour correspondre à mon itinéraire. Il m'a fallu une éternité pour réaliser que le GuidConstraint était contraint par rapport à un vrai Guid, si cela a du sens. :)
Voici ce que j'ai fini avec, qui accepte tout type de données (pas seulement de la chaîne), est un peu plus rapide (je pense), et contient moins si le bloc imbrique.
public class GuidConstraint : IRouteConstraint
{
public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
{
object value;
if (!values.TryGetValue(parameterName, out value)) return false;
if (value is Guid) return true;
var stringValue = Convert.ToString(value);
if (string.IsNullOrWhiteSpace(stringValue)) return false;
Guid guidValue;
if (!Guid.TryParse(stringValue, out guidValue)) return false;
if (guidValue == Guid.Empty) return false;
return true;
}
}
ajoutez juste un "if (values [parameterName] is Guid) return true;" pour capturer les paramètres fortement typés, comme par exemple des tests et pour le routage sortant;) –
Les performances du code peuvent être améliorées en changeant "values.ContainsKey" en "values.TryGetValue" et en supprimant les valeurs [parameterName] call. – ShadowChaser
Mais 'if (values.ContainsKey (parameterName))' check est vraiment inutile, à cause d'une fonctionnalité d'indexeur RouteValueDictionary - il renvoie null si la clé n'existe pas dans la collection [RouteValueDictionary.Item Property sur MSDN] (http://msdn.microsoft.com/en-us/library/system.web.routing.routevaluedictionary.item%28v=vs.110%29.aspx). –