0

我正在开发一个支持多语言的 ASP.NET MVC3 项目。我将所有单词保存在数据库中,并根据 Session 值从中选择。目前我得到的值如下:

    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");

但是,此操作的输出是屏幕上的查询本身。(从 ID=10 的单词中选择 Tr)

4

3 回答 3

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 个字符的语言代码。

于 2012-12-11T00:20:19.917 回答
1

你可以通过反思来做到这一点。只需通过语言键获取属性。

这是一些代码:

 Word word = ...
 string lang = (string)System.Web.HttpContext.Current.Session["Language"];
 PropertyInfo pi = typeof(Word).GetProperty(lang);
 return pi.GetValue(word, null);

我没有处理异常。

于 2012-12-11T12:45:38.293 回答
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();
}
于 2012-12-06T15:31:07.033 回答