c# - ASP.Net MVC 5 获取属性路由值

标签 c# asp.net-mvc asp.net-mvc-5 asp.net-mvc-routing attributerouting

我从旧的属性路由库切换到捆绑的 asp.net MVC 5 路由。但现在我的 lang 路由值在 Application_AcquireRequestState

中为 null
// rootcontroller.cs       
[HttpGet]
[Route("")]
[Route("{lang}")]
// old attribute routing worked:
// [GET("/{lang}")]
public ActionResult Index(string lang =null)
{
    return View();
}

// global.asax
protected void Application_AcquireRequestState(object sender, EventArgs e)
{
    var handler = Context.Handler as MvcHandler;

    if (handler == null)
       return;
    var routeData = handler.RequestContext.RouteData;

    var lang = routeData.Values["lang"];   // null instead for example 'de'
    // ... set current culture
}

最佳答案

MVC 5 中的属性路由使用名为“MS_DirectRouteMatches”的特殊键,其中包含 RouteData 元素列表。我不确定他们为什么这样做,因为似乎只有一个 RouteData 元素是可能的。因此,您需要检查此键并使用其第一个值(如果存在)。

var routeData = handler.RequestContext.RouteData;

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

var lang = routeData.Values["lang"];

关于c# - ASP.Net MVC 5 获取属性路由值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32706387/

相关文章:

c# - 在asp.net core 2.2中使用autofac

c# - 如何对列表进行类型转换?

c# - 添加枚举值会破坏二进制兼容性吗?

javascript - 如何将使用 `getElementsByClassName` 创建的集合发送到我的 Controller ?

asp.net-mvc - 无法使用 IIS Express 在 Windows 10 上运行 Web 应用程序

asp.net-mvc - MVC5 中的 WWWROOT

c# - 工作单元测试的单元测试失败

c# - 我应该为 MVC 或两者使用对象或 ViewModels 吗?

jquery - 在 Internet Explorer 8 中初始加载时不显示 Bootstrap 图标

asp.net-mvc - ASP.NET MVC 5 如何在 Identity 2.0 中删除用户及其相关数据