从动态属性ASP.NET MVC3中选择

时间:2012-12-06 14:17:53

标签: asp.net-mvc-3 select dynamic

我正在开发一个支持多语言的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)

3 个答案:

答案 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();
}