ASP.NET MVC5路径注释MS_DirectRouteMatches

use*_*244 3 c# asp.net asp.net-mvc routes

我有一个ASP.NET和MVC5的小问题(我开始使用MVC.NET).直到昨天,一切都很好!但今天,我不知道为什么,我有"自定义路线注释"的问题.

我有一个控制器"Prodouits"与此动作:

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

在我的观点中,当我调用"Url.Action(...)"时,URL很好.但是当我进入页面时,RouteData似乎很糟糕(RouteData未正确恢复).

看看我的RouteData:Keys [0] =>"MS_DirectRouteMatches"Keys [1] =>"controller"

Values[0] => //A list of only 1 RouteData with my 6 parameters into it...
Values[1] => Produits
Run Code Online (Sandbox Code Playgroud)

如果我删除我的"自定义路线通知",一切都很好,但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);
}
Run Code Online (Sandbox Code Playgroud)

谢谢你的帮助 :-)

编辑:没有人有解决方案?再次感谢你!

Fra*_*len 8

对于属性路由,路由值存储在名为"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; 
Run Code Online (Sandbox Code Playgroud)

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