2017-07-09 48 views
1

這是我的控制器(我已刪除爲簡單起見,完整的代碼)文化無關的代碼的工作方式不同,當文化改變

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

我把'User.Identity.Name.ToUpper()'改成''User.Identity.Name.Normalize()',現在它工作正常。我的問題解決了,但我仍然想知道這與文化有什麼關係? –

回答

2

它與文化和字符串如何相互關聯以及跨不同文化的大寫。這一頁對這個問題非常重要:https://docs.microsoft.com/en-us/dotnet/standard/base-types/best-practices-strings#stringequals

對於幾乎所有的拉丁字母,包括美國英語,字符 「I」(\ u0069)是字符的小寫版本「I」(\ u0049) 。 這種外殼規則很快成爲在這種文化中編程 的默認設置。但是,土耳其語(「tr-TR」)字母包括 「我帶點」字符「İ」(\ u0130),它是 「i」的首字母版本。土耳其語還包括一個小寫字母「i without a dot」字符, 「ı」(\ u0131),大寫字母爲「I」。

在這種情況下,您可能希望使用使用OrdinalIgnoreCase進行規範化+字符串比較。這應該解決文化和資本化問題。

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