最近,我已经开始为我的操作方法使用属性路由,并且在从RouteData获取操作名称(和/或id)方面遇到了困难。下面是使用attrubues的示例,如下所示:
[Route( "Edit/{id:int}" )]
public ActionResult Edit( int id )
{
...
}以前,我使用以下方法作为RouteData的扩展来检索值
public static string GetActionName( this RouteData routeData )
{
return routeData.Values[ "Action" ] as string;
}这用于返回操作名称(在本例中为“编辑”)。现在这个方法总是返回null。对RouteData字典的检查表明,这些值似乎不再放在数组的根中,而是放在按“=”MS_DirectRouteMatches键的项中。
我能够以以下方式访问这个值,但由于我对这些值的填充方式的理解有限,我担心,例如,对于有多个匹配的路由,在某些情况下,代码将失效。
public static string GetActionName( this RouteData routeData )
{
if( routeData.Values.ContainsKey( "MS_DirectRouteMatches" ) )
routeData = ( ( IList<RouteData> )routeData.Values[ "MS_DirectRouteMatches" ] )[ 0 ];
return routeData.Values[ "Action" ] as string;
}访问由RouteData填充的AttributeRouting值的正确方法是什么?
发布于 2015-03-16 18:13:45
你的解决方案只适用于一种情况。请求可能与任何路由不匹配,因此您应该在返回action密钥之前确保它的存在,否则可能会出现异常。
public static string GetActionName( this RouteData routeData )
{
if( routeData.Values.ContainsKey( "MS_DirectRouteMatches" ) )
routeData = ( ( IEnumerable<RouteData> )routeData.Values["MS_DirectRouteMatches"] )[0];
return routeData.Values.ContainsKey("action") ?
routeData.Values["action"] as string :
string.Empty;
}这一种情况通常是将请求传递给IIS,这样它就可以返回404页(或者如果配置了自定义页面),这基本上只涉及自定义404页的情况。
我还会将IList更改为IEnumerable,因为您没有向方法中的列表添加任何内容。
不存在与多个路由匹配的请求(0或1路由是唯一的可能性)。在没有匹配的情况下,MS_DirectRouteMatches将不存在。在确实存在的情况下,集合中有一个值。
不幸的是,在将来的版本中,不能保证集合中的值的数量不会超过一个,但是现在这是正确的。但是,由于没有比这更有力的方法来确定动作名称,所以在下一次突然变化之前,这就是我们一直坚持的方法。
https://stackoverflow.com/questions/27245338
复制相似问题