我正在以“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)
答案 0 :(得分:0)
当没有令牌时,DataTokens集合最初为null。
在tempRoute.DataTokens [“IsDefaultRoute”]
中尝试访问循环中的键值之前,检查tempRoute.Datatokens是否为null