Ajax调用不会触发控制器操作

时间:2015-12-23 17:38:33

标签: jquery ajax asp.net-mvc

我正在尝试向我的控制器中的某个动作发送FormCollection,但该动作永远不会被击中。

形式:

<form class="form-horizontal" role="form" id="TestForm" onsubmit="return false">
<div class="row">
    <div class="col-md-12">
        <div class="form-group">
            <input type="text" name="Blah1" />
            <input type="text" name="Blah2" />
        </div>
        <input id="SubmitButton" type="submit" value="Submit" />
    </div>
</div>

的jQuery / AJAX:

$(document).ready(function () {
    $("#SubmitButton").click(function () {
        var form = $("#TestForm").serialize();


        $.ajax({
            url: "/Calculator/Post",
            type: "POST",
            data: form,
            dataType: 'json',
            success: function () {
                alert("Success");
            },
            error: function () {
                alert("Error");
            }
        });
    });
});

控制器操作:

[HttpPost]
public JsonResult Post(FormCollection form)
{
    return Json(new { success = true }, JsonRequestBehavior.AllowGet);
}

唯一发生的事情是浏览器警告错误消息。我错过了导致动作永远不会被击中的东西吗?

3 个答案:

答案 0 :(得分:1)

.serialize()方法使用标准的URL编码表示法创建文本字符串。serializeArray()方法创建一个JavaScript对象数组,可以编码为JSON字符串。

var form = JSON.stringify($("#TestForm").serializeArray());

答案 1 :(得分:1)

您的代码应该在问题中发布时正常工作。唯一的问题是看你是如何手动构建网址的,这可能会导致404问题,有时这取决于你当前的网址/网页。您应该使用Url.Action帮助程序方法来构建网址,无论您当前在哪个页面,都会负责构建正确的相对网址。

serialize()方法足以发送您的表单数据。它应该工作正常(继续尝试)。您不需要调用serializeArray,然后按照接受的答案建议将其字符串化!

$.ajax({
    url: "@Url.Action("Post","Calculator")",
    type: "POST",
    data: $("#TestForm").serialize(),
    dataType: 'json',
    success: function () {
        alert("Success");
    },
    error: function () {
        alert("Error");
    }
});

如果您在外部js文件中进行此ajax调用,您可以考虑将基本URL传递给js文件,并使用它来构建操作方法的相对URL,如this answer中所述。

此外,在您的操作方法中,您不需要将JsonRequestBehavior.AllowGet参数传递给Json方法,因为您的Action方法标有[HttpPost]

[HttpPost]
public JsonResult Post(FormCollection form)
{
    var item =form["Blah1"];
    return Json(new { success = true });
}

答案 2 :(得分:0)

确保您的控制器Action Method或Method的参数数据类型与正在发布的变量的数据类型相同。

示例:

这不起作用,因为在控制器中,InsertScore方法接收char作为答案数据类型,但我们正在发送&#39; abc&#39;这不是一个字符,因为字符长度是2字节所以只有&#39; a&#39;或者&#39; ab&#39;在这种情况下可以发送。

Ajax Post:

          $.ajax({
                  type: 'POST',
                  url: '/Home/InsertScore',
                  data: { Email: Em, Row: i, Answer: 'age' }
              });

控制器:

    [HttpPost]
    [WebMethod]
    public void InsertScore(string Email ,string Row,char Answer)
    {
     //do something here
    }

正确的方法是。

Ajax Post:

        $.ajax({
              type: 'POST',
              url: '/Home/InsertScore',
              data: { Email: Em, Row: i, Answer: 'a' }
          });

控制器:

    [HttpPost]
    [WebMethod]
    public void InsertScore(string Email ,string Row,char Answer)
    {
      //do something here
    }