我如何创build一个System.Guidtypes的路由约束?

任何人都可以在正确的方向上指出我如何绘制需要两个GUID的路线?

即。 http://blah.com/somecontroller/someaction/ {firstGuid} / {secondGuid}

firstGuid和secondGuid都不是可选的,并且必须是system.Guidtypes?

创build一个RouteConstraint,如下所示:

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

接下来添加路由时:

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

如果您使用kazimanzurrashid的代码,请确保包含Nikos D的评论。 我结束了这个:

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

绝对要警惕@kazimanzurrashid给出的代码。 这是一个好的开始,但它肯定也有一个错误。 我正在传递一个真正的Guid到路由值(而不是一个Guidstring),我无法得到任何匹配我的路线的东西。 我花了很长时间才意识到, GuidConstraint正在制约一个真正的Guid ,如果这是有道理的。 🙂

这是我结束了,它接受任何数据types(不只是string),有点快(我认为),并包含更less的嵌套嵌套。

 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; } } 

+1 @ kazimanzurrashid。 似乎现货。

我将给那些没有C#4.0的人提供一个替代scheme,其中Guid.TryParse是其中的一部分。 正则expression式有另一种select,但可能不值得麻烦。

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

我发现在使用像Html.RouteLink(…)之类的东西时,假设types是一个Guid原因问题,而在URL作为string提供的路由testing中。 下面的代码迎合这些情况。 使用上面的代码示例导致了我的观点和/或testing中的问题,下面的工作正常。

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