【问题标题】:AttributeRouting - Correct way of Getting the Action Name from RouteDataAttributeRouting - 从 RouteData 获取操作名称的正确方法
【发布时间】:2014-12-02 08:54:58
【问题描述】:

我最近开始为我的操作方法使用属性路由,并且正在努力从 RouteData 获取操作名称(和/或 ID)。以下是我如何使用属性的示例:

[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 字典的检查表明,这些值似乎不再放在数组的根目录中,而是放在键为“[0] = “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;
}

访问由 AttributeRouting 填充的 RouteData 值的正确方法是什么?

【问题讨论】:

  • 您找到解决方案了吗?我现在也有同样的问题。

标签: asp.net-mvc asp.net-mvc-routing attributerouting


【解决方案1】:

您的解决方案适用于所有情况,但只有一种情况。一个请求有可能不匹配任何路由,所以你应该在返回之前确保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 将不存在。如果确实存在,则集合中有 1 个值。

不幸的是,实际上并不能保证集合中的值的数量在未来的版本中不会超过一个,但目前情况确实如此。但是,由于没有比这更可靠的方法来确定动作名称,所以在下一次重大更改之前,我们一直坚持使用它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-26
    • 1970-01-01
    • 2012-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多