Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 与区域性无关的代码在区域性更改时的工作方式不同_C#_Asp.net_Asp.net Mvc_Asp.net Core - Fatal编程技术网

C# 与区域性无关的代码在区域性更改时的工作方式不同

C# 与区域性无关的代码在区域性更改时的工作方式不同,c#,asp.net,asp.net-mvc,asp.net-core,C#,Asp.net,Asp.net Mvc,Asp.net Core,这是我的控制器(为了简单起见,我删除了完整的代码) 该观点在文化层面上很好地发挥作用,并被翻译成所有三种(“en-us”、“tr-tr”、“fa-ir”)语言 但问题是,用户已登录并在“en-us”和“fa-ir”中,代码正常工作,但在“tr-tr”user中,由于以下代码,代码为空: ApplicationUser user = db.Users.FirstOrDefault(u => u.NormalizedUserName == User.Identity.Name.ToUp

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

该观点在文化层面上很好地发挥作用,并被翻译成所有三种(“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()
具有正确的值。

这与区域性和字符串的关系以及不同区域性之间的大小写有关。本页与此问题非常相关:

对于几乎所有的拉丁字母,包括美国英语,字符 “i”(\u0069)是字符“i”(\u0049)的小写版本。 这种大小写规则很快就会成为编程人员的默认规则 在这样的文化中。然而,土耳其语(“tr”)字母表包括 “带点的I”字符“İ”(\u0130),它是 “我”。土耳其语还包括一个小写的“i不带点”字符, “ı”(\u0131),大写为“I”

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

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

我将
User.Identity.Name.ToUpper()
更改为
User.Identity.Name.Normalize()
,现在它可以正常工作了。我的问题解决了,但我仍然想知道这与文化有什么关系?
    ApplicationUser user = db.Users.FirstOrDefault(u => u.NormalizedUserName == User.Identity.Name.ToUpper());
var normalizedUserName = User.Identity.Name.Normalize();
ApplicationUser user = db.Users.FirstOrDefault(u => String.Equals(u.NormalizedUserName, normalizedUserName, StringComparison.OrdinalIgnore​Case));