在RouteCollection中验证DataTokens

时间:2014-03-04 23:54:34

标签: c# asp.net-mvc asp.net-mvc-routing

我正在以“How can I get the route name in controller in ASP.NET MVC?”中提到的类似方式扩展RouteCollection。通过这样做,我添加了两个可选的属性。对于我正在添加的其中一个特性,我想验证该值是否在有效范围内并且本质上是唯一的。由于DataTokens是KeyValue集合,我只能考虑检查扩展中的值。但是,在尝试从RouteTable获取GetReadLock()之后,我在foreach期间不断收到错误。这是一个例子:

public static Route MapRouteWithProperties(this RouteCollection routes, string name, string url, object defaults, object constraints, bool isDefaultRoute)
{
  Route route = routes.MapRoute(name, url, defaults, constraints);
  route.DataTokens = new RouteValueDictionary();
  route.DataTokens.Add("IsDefaultRoute", isDefaultRoute);

  if (isDefaultRoute)
  {
    if (routes != null && routes.Count > 0)
    {
      RouteCollection tempRoutes = RouteTable.Routes;
      using (tempRoutes.GetReadLock())
      {
        foreach (Route tempRoute in tempRoutes)
        {
          if (bool.Parse(tempRoute.DataTokens["IsDefaultRoute"].ToString()) == true)
          {
            /// TODO Do something.
          }
        }
      }
    }
  }

  return route;
}

错误是“对象未设置为对象的实例”。这让我相信锁定仍在收藏中。

UPDATE:枚举tempRoutes RouteCollection时会抛出错误,并且恰好发生在:

foreach (Route tempRoute in tempRoutes)

1 个答案:

答案 0 :(得分:0)

当没有令牌时,DataTokens集合最初为null。

在tempRoute.DataTokens [“IsDefaultRoute”]

中尝试访问循环中的键值之前,检查tempRoute.Datatokens是否为null