使用AJAX时,表单数据未发布到控制器

时间:2014-01-09 11:36:54

标签: javascript jquery html ajax asp.net-mvc-4

好的,所以我在我看来有这个表格:

<form id="MyForm">
<input type="text" name="myinput" />
<button type="submit" />
</form>

我的视图顶部有以下Javascript,它在页面加载时运行:

<script type="text/javascript">
    $(document).ready(
        function () {
            $("#MyForm").submit(
                function () {
                    var url = "Home/TestAjax";

                    var dataToSend = $("#MyForm").serialize();
                    alert(dataToSend);

                    $.ajax
                    (
                        {
                            type: "POST",
                            url: url,
                            data: dataToSend,
                            success: function (data) {
                                alert(data);
                            }
                        }
                    );

                    return false;
                }
            );
        }
    );
</script>

表单正在被正确序列化为ajax,由警告框验证。这是我的TestAjax控制器方法:

[HttpPost]
public string TestAjax(string data)
{
    return !string.IsNullOrEmpty(data) ? "Success" : "Failure";
}

返回的值是Failure,因为AJAX没有被回发。我在这里做错了什么?

由于

1 个答案:

答案 0 :(得分:6)

输入字段的名称为myinput而不是data。因此,请确保您始终为行动的参数命名:

[HttpPost]
public ActionResult TestAjax(string myinput)
{
    return !string.IsNullOrEmpty(myinput) ? Content("Success") : Content("Failure");
}

当您使用$("#MyForm").serialize()时,这将返回myinput=some_value,其中some_value显然是用户在此输入字段中输入的值。

如果您的表单中有2个输入字段:

<form id="MyForm">
    <input type="text" name="foo" />
    <input type="text" name="bar" />
    <button type="submit" />
</form>

你当然会写一个视图模型:

public class MyViewModel
{
    public string Foo { get; set; }
    public string Bar { get; set; }
}

您的控制器操作将作为参数:

[HttpPost]
public ActionResult TestAjax(MyViewModel model)
{
    return !string.IsNullOrEmpty(model.Foo) ? Content("Success") : Content("Failure");
}

另请注意,在ASP.NET MVC控制器中,操作应返回ActionResults,而不是字符串或其他任何内容。