Indudablemente tenga cuidado con el código dado por @kazimanzurrashid. Fue un buen comienzo, pero definitivamente también tiene un error. Estaba pasando un Guid real en los valores de la ruta (en lugar de una cadena de Guid), y no pude obtener nada para que coincida con mi ruta. Me llevó mucho tiempo darme cuenta de que GuidConstraint era restrictivo contra Guid, si tiene sentido. :)
Esto es lo que terminé con, que acepta cualquier tipo de datos (no solo de cadena), es un poco más rápido (creo) y contiene menos si el bloque anida.
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;
}
}
simplemente agregue un "if (values [parameterName] es Guid) return true;" para capturar los parámetros fuertemente tipados, como por ejemplo de las pruebas y para el enrutamiento de salida;) –
El rendimiento del código se puede mejorar cambiando "values.ContainsKey" a "values.TryGetValue" y eliminando la llamada a los valores [parameterName]. – ShadowChaser
Pero la comprobación 'if (values.ContainsKey (parameterName))' es realmente innecesaria, debido a una función del indexador RouteValueDictionary; devuelve null si la clave no existe en la colección [RouteValueDictionary.Item Property en MSDN] (http://msdn.microsoft.com/en-us/library/system.web.routing.routevaluedictionary.item%28v=vs.110%29.aspx). –