0

多言語をサポートする 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)

4

3 に答える 3

1

ORMとしてEFを使用している場合は、次のようなことができます。

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 に答える