我正在使用支持多种语言的数据库。现在的问题是我需要将我的语言输入查询以获取信息,这很好,但是存储该信息的最佳方式是什么。
在客户端,它当然会存储在cookie中。现在,只有我能想到的方法是在类上创建全局变量,然后在我的函数中使用它。这是唯一的方式吗?
private string lang = Infrastructure.UserSettings.Language(); // I don't have this implemented yet
[HttpGet]
public dynamic List()
{
string lang = "English"; // That's why I set it here manually for testing
var items = _db.Items.OrderByDescending(x => x.ID).Select(x => new
{
ID = x.ID,
Price = x.Price,
Name = x.ItemTranslations.Where(y => y.Language.Name == lang).Select(y => y.Name).SingleOrDefault(),
Category = new {
ID = x.Category.ID,
Name = x.Category.CategoryTranslations.Where(y => y.Language.Name == lang).Select(y => y.Name).SingleOrDefault()
}
});
return items;
}
我的问题:这样做的好方法还是有更优化的方式?
答案 0 :(得分:1)
您可以使用只读变量创建一个基本控制器,如下所示:
public class BaseController : Controller
{
public string UserLanguage
{
get
{
var cLanguage = HttpContext.Request.Cookies["lang"];
if (cLanguage != null)
return cLanguage.Value;
else
return "English";
}
}
}
然后继承您的基本控制器,如下所示:
public class HomeController : BaseController
然后像这样访问你的变量:
var items = _db.Items.OrderByDescending(x => x.ID).Select(x => new
{
ID = x.ID,
Price = x.Price,
Name = x.ItemTranslations.Where(y => y.Language.Name == UserLanguage).Select(y => y.Name).SingleOrDefault(),
Category = new {
ID = x.Category.ID,
Name = x.Category.CategoryTranslations.Where(y => y.Language.Name == lang).Select(y => y.Name).SingleOrDefault()
}
});
您只需要在特定时间设置Cookie。
答案 1 :(得分:0)
在每次页面请求时都会向服务器发送cookie。如果cookie中的设置可用,只需在需要进行查询时阅读cookie。读取已经存在的cookie没有性能开销。