【问题标题】:MVC5 get area name when using attribute routingMVC5 使用属性路由时获取区域名称
【发布时间】:2015-06-06 11:50:44
【问题描述】:

我有一个旧的 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 中的区域数据。区域名称实际上是一个更大的应用程序中的子工具名称,用于基础控制器初始化中的一些逻辑。

【问题讨论】:

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


    【解决方案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);
    }
    

    【讨论】:

    • 我应该早点回复,但这是我在看到您的答案之前就采用的解决方案。谢谢。
    猜你喜欢
    • 2014-12-04
    • 2013-12-29
    • 2016-01-12
    • 2014-05-31
    • 2023-04-10
    • 2013-10-12
    • 2014-11-19
    • 1970-01-01
    • 2014-12-27
    相关资源
    最近更新 更多