gpt4 book ai didi

asp.net-mvc - AttributeRouting - 从 RouteData 获取 Action 名称的正确方法

转载 作者:行者123 更新时间:2023-12-04 00:26:15 25 4
gpt4 key购买 nike

我最近开始为我的操作方法使用属性路由,并且正在努力从 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 字典的检查表明,这些值似乎不再放在数组的根中,而是放在键控为“[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 值的正确方法是什么?

最佳答案

除一种情况外,您的解决方案在所有情况下都有效。一个请求有可能不匹配任何路由,所以你应该在返回它之前确保 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 个值。

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

关于asp.net-mvc - AttributeRouting - 从 RouteData 获取 Action 名称的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27245338/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com