代码之家  ›  专栏  ›  技术社区  ›  Ashkan Mobayen Khiabani

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

  •  1
  • Ashkan Mobayen Khiabani  · 技术社区  · 7 年前

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

    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”)语言。

    user 由于以下代码,为null:

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

    请注意,即使文化是“tr tr”,跟踪也表明 User.Identity.Name.ToUpper() 具有正确的值。

    1 回复  |  直到 7 年前
        1
  •  2
  •   John Bindel    7 年前

    https://docs.microsoft.com/en-us/dotnet/standard/base-types/best-practices-strings#stringequals

    对于几乎所有的拉丁字母,包括美国英语,字符 “i”。土耳其语还包括小写的“i without a dot”字符, “±”(\u0131),大写为“I”。

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