这是我的控制器(为简单起见,我删除了完整的代码)
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()
具有正确的值。
答案 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.OrdinalIgnoreCase));