我的 C# 代码中将此 javascript 表达式代码作为字符串,我需要使用 Microsoft.JScript.Eval.JScriptEvaluate (c#) 对其进行评估(执行)并获取结果。
string code = @"var roles=[];
roles.push('LOC_IND');
roles.push('MANAGERL3');
var country='CANADA';
var age=80;
eval(""roles.indexOf('Administrator')>=0||roles.indexOf('LOC_IND')>=0&&country=='CANADA'"")";
// Calling JScript.Eval to execute that code
var engine = Microsoft.JScript.Vsa.VsaEngine.CreateEngine();
var result = Microsoft.JScript.Eval.JScriptEvaluate(code, engine);
如果您在浏览器控制台中执行 JavaScript 代码,它本身工作正常,并按预期返回“true”:
var roles=[];
roles.push('LOC_IND');
roles.push('MANAGERL3');
var country='CANADA';
var age=80;
eval("roles.indexOf('Administrator')>=0||roles.indexOf('LOC_IND')>=0&&country=='CANADA'")
但是,当我从 C# Eval.JScriptEvaluate(code, engine); 调用它时我得到这个异常:
Function expected.
我不确定它需要什么功能以及我需要做什么来解决这个问题? 最后 Eval.JScriptEvaluate(code, engine) 必须返回 true。
最佳答案
首先,您不需要调用 eval。
其次,您应该将代码包装在自调用函数中,因为您期望得到一个结果。
第三,看起来Microsoft JScript不支持JavaScript的Array.prototype的部分或全部方法,因此您不能使用indexOf()。
试试这个代码:
string code = @"
function hasRole(roles,role){
for(var i=0;i<roles.length;i++)
if(roles[i]==role)return true;
return false;
};
(function(){
var roles=[],country='CANADA',age=80;
roles.push('LOC_IND');
roles.push('MANAGERL3');
return hasRole(roles,'Administrator')||hasRole(roles,'LOC_IND')&&country=='CANADA';
})();";
附带说明一下,您的返回语句中似乎缺少一对括号。
关于javascript - 从 C# 执行 JS 代码时出现异常 : Function expected,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27843327/