MVC5在使用属性路由时获取区域名称

时间:2015-04-01 17:49:11

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

我有一个旧的MVC3网站,我可以使用以下代码获取路线区域:

object oArea;

RouteData.DataTokens.TryGetValue("area", out aArea);

我正在创建一个新的MVC5应用程序,并开始使用基于属性的路由,如下所示:

[RouteArea("Area")]
[RoutePrefix("Test")]
public TestController
{
    public ActionResult Index()
    {
         return View("Index");
    }
}

不幸的是,当您使用基于属性的路由时,似乎RouteData.DataTokens集合为空。区域信息显示在" MS_DirectRouteMatches"中的RouteData下,因此您可以获得如下数据:

RouteData.Values["MS_DirectRouteMatches"])[0].DataTokens.TryGetValue("area", out oArea);

但是,我想知道是否有更简单,更安全或更好的方法来获取MVC5中的区域数据。区域名称实际上是较大应用程序中的子工具名称,用于基本控制器初始化中的某些逻辑。

1 个答案:

答案 0 :(得分:1)

唯一的"安全"方法是首先检查是否存在MS_DirectRouteMatches,并且仅检查该区域是否存在,如果不存在,则回退到原始RouteData对象。

string area;
RouteData routeData = HttpContext.Request.RequestContext.RouteData;

if (routeData != null)
{
    if (routeData.Values.ContainsKey("MS_DirectRouteMatches"))
    {
        routeData = ((IEnumerable<RouteData>)routeData.Values["MS_DirectRouteMatches"]).First();
    }
    routeData.DataTokens.TryGetValue("area", out area);
}