从jquery ajax

时间:2018-07-27 19:39:37

标签: c# jquery ajax

我想从控制器中调用一个方法来计算基本的算术运算。但是,我只得到未定义的错误。我的代码是

$("#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);
    }

预先感谢

1 个答案:

答案 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最适合。