Определенно будьте осторожны с кодом, заданным @kazimanzurrashid. Это было хорошее начало, но оно определенно имеет ошибку или слишком. Я передавал настоящий Guid в значения маршрута (вместо строки Guid), и я не мог получить ничего, что соответствовало бы моему маршруту. Мне потребовалось целую вечность, чтобы понять, что GuidConstraint ограничивает реальный Guid , если это имеет смысл. :)
Вот то, что я закончил, который принимает любой тип данных (не только строку), немного быстрее (я думаю) и содержит меньше , если блок вложенность.
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;
}
}