Asp.net mvc 5 具有基类实现的属性路由:正确列出但仍然失败

Asp.net mvc 5 具有基类实现的属性路由:正确列出但仍然失败,asp.net-mvc-5,asp.net-mvc-routing,Asp.net Mvc 5,Asp.net Mvc Routing,我在继承基类的控制器类上设置了属性路由,在基类中我处理I18N文化集/选择逻辑(如本文所述),但该过程失败,尽管路由似乎设置正确 [RoutePrefix("{culture}")] public class HomeController : BaseController { public ActionResult Index() { return View(); } [Route("Hakkimda")] public ActionRes

我在继承基类的控制器类上设置了属性路由,在基类中我处理I18N文化集/选择逻辑(如本文所述),但该过程失败,尽管路由似乎设置正确

[RoutePrefix("{culture}")]
public class HomeController : BaseController
{
    public ActionResult Index()
    {
        return View();
    }
    [Route("Hakkimda")]
    public ActionResult About()
    {
        ViewBag.Message = "Your application description page.";

        return View();
    }

当我尝试链接时,我在浏览器上看到灰色的死亡屏幕,地址栏上显示:

http://localhost:53530/tr-tr/Hakkimda?MS_DirectRouteMatches=System.Collections.Generic.List%601%5BSystem.Web.Routing.RouteData%5D
我认为问题在于基本控制器实现基于BeginExecuteCore重载的I18N逻辑的方式

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);
}
可能BeginExecuteCore的执行优先级和路由有一些不匹配,但我对这两方面的知识不足以解决这个问题

我看过这篇文章(),但提供的示例有点不同,因为它是新的,所以网上没有其他示例。

删除此代码

  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);                
}

安东先生的回答会阻止你在地址栏上看到垃圾,但也会阻止语言的改变

在从MVC5更改为MVC5.2之后,我遇到了这个问题

解决方法是查看管线数据是否位于嵌套管线索引中

        var routeData = RouteData;
        if (routeData.Values.ContainsKey("MS_DirectRouteMatches"))
        {
            routeData = ((IEnumerable<System.Web.Routing.RouteData>)routeData.Values["MS_DirectRouteMatches"]).First();
        }
        string cultureName = routeData.Values["culture"] as string;
var routeData=routeData;
if(routeData.Values.ContainsKey(“MS_DirectRouteMatches”))
{
routeData=((IEnumerable)routeData.Values[“MS_DirectRouteMatches”]).First();
}
字符串cultureName=routeData.Value[“culture”]作为字符串;

然后它就开始工作了。

你能解释一下原因吗?现在无法测试,但看起来是一个可能的解决方案。