2011-10-10 54 views
4

那麼,我有很多javascript的變量,我需要獲取值(我從其他頁面獲得)。 這樣做的最好方法是什麼? 我使用Microsoft.Jscript類和您的方法工作。如何使用C#運行jscript並返回數組中的值?

我寫了下面的代碼:

static Dictionary<string, string> ParseVariables(string code) 
     { 

      string[] variables = code.Split(';'); 
      Dictionary<string, string> variablesValues = new Dictionary<string, string>(); 
      for (int i = 0, len = variables.Length - 1; i < len; i++) 
      { 
       string vvar = variables[i]; 
       string varName = Regex.Replace(vvar.Split('=')[0], @"^\s*var\s*", string.Empty).Trim(); 
       var compiler = Compile(vvar);     
       string varValue = compiler.ToString(); 
       variablesValues.Add(varName, varValue); 
      } 

      return variablesValues; 

     }   


static object Compile(string JSource) 
     { 
      return Microsoft.JScript.Eval.JScriptEvaluate(JSource, Microsoft.JScript.Vsa.VsaEngine.CreateEngine()); 
     } 

能正常工作的一些情況,如:

var jscript = "var x = 'foo'; var y = 'baa';"; 
var output = ParseVariables(jscript); 
var val = output["y"]; //baa 
var val2 = output["x"]; //foo 

但情況是這樣的:

var jscript = "var x = {}; x['foo'] = 'baa'; x['baa'] = 'test';"; 
var output = ParseVariables(jscript); 
var val = output["x['foo']"]; //not works 

我如何做到這一點?任何幫助表示讚賞!謝謝!

+0

這是非常不清楚你在問什麼。這是一個ASP.NET頁面嗎?您正在談論的JavaScript是否在瀏覽器中運行? –

+0

@Jonh:這是一個控制檯應用程序。 我從其他頁面獲取的javascript代碼爲字符串 –

+0

這是一個非常不尋常的環境。我強烈建議你通過編輯你的問題來描述它。 –

回答

2

由於您的方法是用分號(;)分隔大塊的JScript源代碼,因此只有var;之間的部分將使用Compile方法進行編譯。

如果您將JScript源代碼更改爲var x = { "foo": "baa", "baa": "test" };,則編譯方法將正常工作,並且它將返回一個ScriptObject對象。

但是,然後,還有另一個錯誤 - 您在使用ToString將值插入生成的詞典之前。

只需按照自己的代碼一行一行,這應該是顯而易見的。

嘗試了這一點,以獲得更好的方向開始:

更改編譯方法進入返回ScriptObject,像這樣:

static ScriptObject Compile(string JSource) 
{ 
    return (ScriptObject)Microsoft.JScript.Eval.JScriptEvaluate(JSource, Microsoft.JScript.Vsa.VsaEngine.CreateEngine()); 
} 

那就試試這個:

var x = Compile("var x = { foo: 'baa', bar: { 'nisse': 'kalle' } };"); 

var foo = x["foo"]; 
var bar = (ScriptObject)x["bar"]; 
var nisse = bar["nisse"]; 
1

似乎這裏有很多假設。例如,你正在將所有的值返回到一行。你可以嘗試這樣設置vvar:

string vvar = variables[i].Trim(); 

這將修剪掉不需要的換行符和其他空格。

你可以爲第二個例子發佈compiler.ToString()的輸出嗎?我猜想問題在於解析,而不是在JScript編譯器中。

而且,在這樣的情況下會發生什麼:

var foo = 'a'; 
foo = 'b'; 
foo = 'c'; 

什麼價值與foo結束了?

相關問題