我想从控制器中调用一个方法来计算基本的算术运算。但是,我只得到未定义的错误。我的代码是
$("#equals3").click(
function () {
let display = $("#calculatorDisplay");
let currentValue = display.val();
$.ajax({
url:'Calculator/EvaluateExpressionAJAX',
type: 'POST',
data: { expression: currentValue },
contentType: 'application/json; charset=utf-8',
success: function (response) {
if (response.success) {
alert(response);
} else {
alert(response.responseText);
}
},
error: function (response) {
alert("error!");
}
});
});
我的控制器包含
public static Dictionary<string, ArithmeticOperation> EvaulationDictionary = new Dictionary<string, ArithmeticOperation> {
{ "+", (a, b) => a + b},
{ "-", (a, b) => a - b},
{ "*", (a, b) => a * b},
{ "/", (a, b) => a / b},
{ "%", (a, b) => a % b} };
[HttpPost]
public double EvaluateExpressionAJAX(string expression)
{
expression = expression.Trim();
string[] splitExpression = Regex.Split(expression, @"\s+");
double a = Convert.ToDouble(splitExpression[0]);
double b = Convert.ToDouble(splitExpression[2]);
string op = splitExpression[1];
return EvaulationDictionary[op](a, b);
}
预先感谢
答案 0 :(得分:0)
如果您在javascript中放置一个断点,您可能会发现MVC / WebApi返回一个错误页面,并显示以下消息:
Invalid JSON primitive: expression
您发布的JSON无效,甚至都不是JSON。
如果您将其替换为:
data: "{ \"expression\": \"" + currentValue +"\" }",
这会将有效的json发布到ActionMethod。
更好的选择是创建一个JavaScript对象并对其进行字符串化,如下所示:
// create a js object before the Ajax call
let dataObj = { "expression": currentValue };
// change the data you send to this
data: JSON.stringify(dataObj),
其次:我不能确定好看一下url,但是,如果您从中渲染的页面是相同的控制器和index方法,则此方法可能无法按预期工作。将该URL更改为:
url:'/Calculator/EvaluateExpressionAJAX',
使其绝对。
最后,Action方法中存在许多可能的错误。您不能期望用户提供3个零件,其中零件1和零件3是双份的。因此,有很多检查遗漏。
最后但并非最不重要的一点是,如果这是MVC,则最好从一种操作方法中返回ActionResult
或某些子类型,在这种情况下JsonResult
最适合。