用于枚举的IRouteConstraint

时间:2011-06-07 09:28:54

标签: asp.net-mvc asp.net-mvc-2 asp.net-mvc-routing url-routing

我想创建一个IRouteConstraint,它根据枚举的可能值过滤值。 我试图为自己谷歌,但这没有任何结果。

有什么想法吗?

2 个答案:

答案 0 :(得分:9)

这就是我提出的:

public class EnumRouteConstraint<T> : IRouteConstraint
  where T : struct
{

  private readonly HashSet<string> enumNames;

  public EnumRouteConstraint()
  {
    string[] names = Enum.GetNames(typeof(T));
    enumNames = new HashSet<string>(from name in names select name.ToLowerInvariant());
  }

  public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
  {
    return enumNames.Contains(values[parameterName].ToString().ToLowerInvariant());
  }
}

我认为HashSet在每场比赛中的表现要比Enum.GetNames好得多。使用泛型也会使你在使用约束时看起来更流畅。

不幸的是,编译器不允许使用T:Enum。

答案 1 :(得分:4)

请参阅this

基本上,你需要

  private Type enumType;

  public EnumConstraint(Type enumType)
  {
    this.enumType = enumType;
  }

  public bool Match(HttpContextBase httpContext, 
    Route route, 
    string parameterName,     
    RouteValueDictionary values, 
    RouteDirection routeDirection)
  {
    // You can also try Enum.IsDefined, but docs say nothing as to
    // is it case sensitive or not.
    return Enum.GetNames(enumType).Any(s => s.ToLowerInvariant() == values[parameterName].ToString());
  }