首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AttributeRouting -从RouteData获取Action的正确方法

AttributeRouting -从RouteData获取Action的正确方法
EN

Stack Overflow用户
提问于 2014-12-02 08:54:58
回答 1查看 1.2K关注 0票数 3

最近,我已经开始为我的操作方法使用属性路由,并且在从RouteData获取操作名称(和/或id)方面遇到了困难。下面是使用attrubues的示例,如下所示:

代码语言:javascript
复制
[Route( "Edit/{id:int}" )]
public ActionResult Edit( int id )
{
    ...
}

以前,我使用以下方法作为RouteData的扩展来检索值

代码语言:javascript
复制
public static string GetActionName( this RouteData routeData )
{
    return routeData.Values[ "Action" ] as string;
}

这用于返回操作名称(在本例中为“编辑”)。现在这个方法总是返回null。对RouteData字典的检查表明,这些值似乎不再放在数组的根中,而是放在按“=”MS_DirectRouteMatches键的项中。

我能够以以下方式访问这个值,但由于我对这些值的填充方式的理解有限,我担心,例如,对于有多个匹配的路由,在某些情况下,代码将失效。

代码语言:javascript
复制
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值的正确方法是什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-03-16 18:13:45

你的解决方案只适用于一种情况。请求可能与任何路由不匹配,因此您应该在返回action密钥之前确保它的存在,否则可能会出现异常。

代码语言:javascript
复制
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将不存在。在确实存在的情况下,集合中有一个值。

不幸的是,在将来的版本中,不能保证集合中的值的数量不会超过一个,但是现在这是正确的。但是,由于没有比这更有力的方法来确定动作名称,所以在下一次突然变化之前,这就是我们一直坚持的方法。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27245338

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档