2012-12-06 75 views
0

我正在开发一个具有多语言支持的ASP.NET MVC3项目。我保存数据库中的所有单词,并根据Session值从中进行选择。目前我得到的值,如下所示:从动态属性中选择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(); 
    } 

本型一句话:

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 WHERE ID = 10)

+0

您使用的是什么ORM? EF? – Charlino

+0

是的,我使用EntityFramework –

回答

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注入,可能是最好的测试它是一个2字符的语言代码之前发送sql请求到服务器。

+0

谢谢,在这个项目上,针对sql注入的安全性对我来说不是问题。但是,在您的示例代码的第4行中,出现错误: “非泛型方法'System.Data.Entity.DbSet .SqlQuery(string,params object [])'不能与类型参数xxx/HomeController一起使用“ –

+0

看起来像你在调用'context.Words。SqlQuery ()'而不是'context.Database.SqlQuery ()'。您可能还需要将int转换为对象。 – Charlino

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(); 
} 
+0

相应编辑。 –

+0

@IsmetAlkan我预计10是一种关键。 – Tobias

+0

这只是使用开关而不是if。 –

1

你可以通过反思来完成。只需通过语言键获取财产。

下面是一些代码:

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

我没有在异常处理。