我正在开发一个支持多语言的ASP.NET MVC3项目。我保存数据库中的所有单词,并根据会话值从中进行选择。目前我得到的值如下:
public ActionResult Index()
{
string lang = (string)System.Web.HttpContext.Current.Session["Language"];
if (lang == "Tr" || lang == null)
{
ViewBag.Admin = db.Words.Find(10).Tr;
}
else if(lang == "En")
{
ViewBag.Admin = db.Words.Find(10).En;
}
return View();
}
目前的Word:
public class Word
{
public int ID { get; set; }
public string Tr { get; set; }
public string En { get; set; }
}
然而,语言的数量会增加,并且使用现有方法我需要手动添加这些语言。我想要的是动态地获取单词的“会话”语言形式,例如(伪):
ViewBag.Admin = db.Words.Find(10)."Session[Language]";
我知道它应该很简单但找不到合适的关键字来找到它。任何想法我怎么能实现这个目标?
编辑:我只需要一种执行SQL字符串的方法,如下所示:
String lang = (string)System.Web.HttpContext.Current.Session["Language"];
ViewBag.MyWord = ExecuteSQL.("SELECT " + lang + " FROM Words WHERE ID = " + 10 + " ");
编辑2 :我尝试了以下几行:
ViewBag.Admin = db.Words.SqlQuery("SELECT" +
(string)System.Web.HttpContext.Current.Session["Language"] +
"FROM Words WHERE ID=10");
但是,此输出是屏幕上的查询本身。 (SELECT Tr FROM Words WHERE ID = 10)
答案 0 :(得分:1)
如果您使用EF作为您的ORM,您可以执行以下操作:
int wordId = 10;
string lang = (string)System.Web.HttpContext.Current.Session["Language"];
var query = "SELECT " + lang + " FROM Words WHERE ID = {0}";
var word = context.Database.SqlQuery<string>(query, wordId).FirstOrDefault();
有关原始SQL查询的详细信息,请参阅此处:
http://msdn.microsoft.com/en-us/data/jj592907.aspx
注意:以上内容可以对sql注入开放,最好在将sql请求发送到服务器之前测试它是2个字符的语言代码。
答案 1 :(得分:1)
你可以通过反思来做到这一点。只需按语言键即可获得该物业。
以下是一些代码:
Word word = ...
string lang = (string)System.Web.HttpContext.Current.Session["Language"];
PropertyInfo pi = typeof(Word).GetProperty(lang);
return pi.GetValue(word, null);
我没有处理异常。
答案 2 :(得分:0)
您可以使用表达式/委托。
根据Session["Language"]
编写一个返回表达式的方法。
private string GetLanguageStringByKey(int key){
return GetFuncByLanguage()(db.Words.Find(key));
}
private Func<Word,string> GetFuncByLanguage(){
string lang = (string)System.Web.HttpContext.Current.Session["Language"];
Func<Word, string> func;
switch(lang){
case "En":{
func = w => w.En;
break;
}
default:{
func = w => w.Tr;
break;
}
}
return func;
}
public ActionResult Index()
{
ViewBag.Admin = GetLanguageStringByKey(10);
return View();
}