Asp.net mvc 5 具有基类实现的属性路由:正确列出但仍然失败
我在继承基类的控制器类上设置了属性路由,在基类中我处理I18N文化集/选择逻辑(如本文所述),但该过程失败,尽管路由似乎设置正确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
[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”]作为字符串;
然后它就开始工作了。你能解释一下原因吗?现在无法测试,但看起来是一个可能的解决方案。