2011-10-10 52 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结束了?

相关问题