在路由集合中验证数据令牌



我正在以类似的方式扩展 RouteCollection,如"如何在 MVC ASP.NET 控制器中获取路由名称?"中所述。通过这样做,我将添加两个可选的属性。对于我添加的属性之一,我想验证该值是否在有效范围内并且本质上是唯一的。由于数据令牌是一个键值集合,我只能考虑检查我的扩展中的值。但是,在尝试从路由表中获取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;
}

错误是"对象未设置为对象的实例",这使我相信锁仍在集合上。

更新:枚举临时路由路由集合时引发错误,并且恰好发生在:

foreach (Route tempRoute in tempRoutes)

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

在尝试访问 tempRoute.DataTokens ["IsDefaultRoute"] 循环中的键值之前,请检查 tempRoute.Datatokens 是否为 null

相关内容

最新更新