2012-12-06 43 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); 

我沒有在異常處理。