文化无关的代码在文化发生变化时的工作方式不同

时间:2017-07-09 21:40:18

标签: c# asp.net asp.net-mvc asp.net-core

这是我的控制器(为简单起见,我删除了完整的代码)

public IActionResult Settings(SettingsViewModel model, ICollection<IFormFile> file)
{
    ApplicationUser user = db.Users.FirstOrDefault(u => u.NormalizedUserName == User.Identity.Name.ToUpper());
    return View(model);
}

这是我的路线:

    app.UseMvc(routes =>
    {
        routes.MapRoute(
            name: "default",
            template: "{culture=fa-IR}/{controller=Names}/{action=GirlAndBoy}/{p1=A}/{p2=1}");
    });

该观点在文化方面很有效,并且可以翻译成所有三种语言('en-us','tr-tr','fa-ir')语言。

但问题是,用户登录并在'en-us'和'fa-ir'中代码正常工作,但'tr-tr'user由于以下原因而为空代码:

    ApplicationUser user = db.Users.FirstOrDefault(u => u.NormalizedUserName == User.Identity.Name.ToUpper());

请注意,即使文化是'tr-tr',跟踪也会显示User.Identity.Name.ToUpper()具有正确的值。

1 个答案:

答案 0 :(得分:2)

它与文化和字符串的关系以及跨不同文化的资本化有关。此页面与此问题非常相关:https://docs.microsoft.com/en-us/dotnet/standard/base-types/best-practices-strings#stringequals

  

几乎所有拉丁字母,包括美国英语,角色   “i”(\ u0069)是字符“I”(\ u0049)的小写版本。   此套管规则很快成为某人编程的默认设置   在这样的文化中。但是,土耳其语(“tr-TR”)字母包含一个   “我带点”字符“İ”(\ u0130),这是首字母版本   “一世”。土耳其语还包括一个小写的“我没有点”字符,   “ı”(\ u0131),大写为“我”。

在这种情况下,您可能希望使用OrdinalIgnoreCase使用规范化+字符串比较。这应解决文化和资本化问题。

var normalizedUserName = User.Identity.Name.Normalize();
ApplicationUser user = db.Users.FirstOrDefault(u => String.Equals(u.NormalizedUserName, normalizedUserName, StringComparison.OrdinalIgnore​Case));