c# - ASP.NET MVC5 路由注释 MS_DirectRouteMatches

标签 c# asp.net asp.net-mvc routes

我在使用 ASP.NET 和 MVC5 时遇到了一个小问题(我是从 MVC.NET 开始的)。 直到昨天,一切都很好!但是今天,我不知道为什么,“自定义路由注释”出现了问题。

我有一个 Controller “产品”与此操作:

[Route("{culture}/Produits/{nom_groupe}/{nom}-{id}")]
public ActionResult Detail(string nom_groupe, string nom, string id)
{
    // ...   
    return View();
}

在我看来,当我调用“Url.Action(...)”时,URL 是好的。但是当我进入页面时,RouteData 似乎是坏的(RouteData 没有正确恢复)。

看看我的 RouteData : 键[0] =>“MS_DirectRouteMatches” 键[1] => " Controller "

Values[0] => //A list of only 1 RouteData with my 6 parameters into it...
Values[1] => Produits

如果我删除我的“Custom Route Annontation”,一切正常,但 URL 很糟糕......

有人知道问题和解决方案吗? 感谢大家的帮助!

编辑: 有关问题的更多信息。 我有一个语言的“BaseController”。我覆盖了“BeginExecuteCore”方法。 有代码:

protected override IAsyncResult BeginExecuteCore(AsyncCallback callback, object state)
{
    string cultureName = RouteData.Values["culture"] as string;

    // Attempt to read the culture cookie from Request
    if (cultureName == null)
        cultureName = Request.UserLanguages != null && Request.UserLanguages.Length > 0 ? Request.UserLanguages[0] : null; // obtain it from HTTP header AcceptLanguages

    // Validate culture name
    cultureName = CultureHelper.GetImplementedCulture(cultureName); // This is safe


    if (RouteData.Values["culture"] as string != cultureName)
    {

        // Force a valid culture in the URL
        RouteData.Values["culture"] = cultureName.ToLowerInvariant(); // lower case too

        // Redirect user
        Response.RedirectToRoute(RouteData.Values);
    }


    // Modify current thread's cultures            
    Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo(cultureName);
    Thread.CurrentThread.CurrentUICulture = Thread.CurrentThread.CurrentCulture;

    return base.BeginExecuteCore(callback, state);
}

谢谢你的帮助:-)

编辑: 没有人有解决办法吗? 再次感谢!

最佳答案

对于属性路由,路由值存储在名为“MS_DirectRouteMatches”的嵌套 路由键中(正如您自己已经发现的那样)。

以下是如何在使用属性路由时使 RouteData 按预期工作:

protected override IAsyncResult BeginExecuteCore(AsyncCallback callback, object state)
{
    // DEMO: now cultureNameTest will be null
    string cultureNameTest = RouteData.Values["culture"] as string; 

    var routeData = RouteData;
    if (routeData.Values.ContainsKey("MS_DirectRouteMatches"))
    {
        routeData = ((IEnumerable<System.Web.Routing.RouteData>)RouteData.Values["MS_DirectRouteMatches"]).First();
    }

    // Now cultureName will not be null
    cultureName = routeData.Values["culture"] as string; 

我在这里找到了这个解决方案:https://stackoverflow.com/a/29083492/533460

关于c# - ASP.NET MVC5 路由注释 MS_DirectRouteMatches,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25727558/

相关文章:

c# - 为什么带有运算符的一个 lambda 表达式可以工作,而另一个则不行

c# - 通过服务器 : Wrong path to excel file? 上的代码运行宏

asp.net - SQL Server 条件选择语句

c# - RedirectingResponse.AsActionResult() 不再存在,对于 DotNetOpenAuth,我可以用什么替换它?

c# double 值显示为 .9999998?

c# - 如何正确关闭保存文件句柄

mysql - 如果在关闭连接之前从未调用 transaction.Rollback/Commit 会发生什么?

c# - 我如何在 ASP.NET MVC 6 (六) 代码中获取 bin 或 wwwroot 目录

c# - 'System.Web.Mvc.SelectListItem' 不包含名称为 'id' 的属性 #2

c# - MVC3 - 正在缓存 AJAX 局部 View ......我无法阻止它