单击按钮时运行控制器方法MVC4 C#

时间:2014-11-06 16:36:53

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

我正在使用visual studio 2013,MVC4和C#制作一个简单的应用程序。此Web应用程序具有一个包含多个复选框的表,默认情况下会显示一个“更新”按钮。单击一个或多个复选框时,我会激活该按钮。

这里的想法是,当单击“更新”按钮时,将复选框的所有信息(打开或关闭的)发送到服务器,然后将这些更改保存在数据库中。

为了达到这个目的,我试图通过jquery使用ajax,但不幸的是我没有成功,因为当我点击按钮时没有任何反应。

这是我用来为客户端生成视图的cshtml文件:

<input type="submit" value="Save Checkbox Changes" class="btn btn-primary disabled" id="SaveCheckboxChanges" />

<table class="table">
    <tr>
        <th>
            @Html.DisplayNameFor(model => model.RequiresSetup)
        </th>
        <th>
            @Html.DisplayNameFor(model => model.Disabled)
        </th>
    </tr>

    @{
        foreach (var item in Model)
        {

            <tr>
                <td>
                    @Html.EditorFor(modelItem => item.RequiresSetup)
                </td>
                <td>
                    @Html.EditorFor(modelItem => item.Disabled)
                </td>
            </tr>
        }
}
</table>

我对按钮SaveCheckboxChanges的javascript代码如下:

$("#SaveCheckboxChanges").click(function (event) {
        if (!$("#SaveCheckboxChanges").hasClass("disabled")) {

            $.ajax({
                url: '/Material/UpdateCheckBoxes',
                type: 'POST',
                data: {bla: "bdsjdnjsdnsnd"

                },
                contentType: 'application/json; charset=utf-8',
                success: function (data) {
                    alert(data.success);
                },
                error: function () {
                    alert("error");
                }
            });
        }

    });

在我的材料控制器中,我有以下内容:

[HttpPost]
public ActionResult UpdateCheckBoxes(string bla)
{
    return Content("Working!" +  bla);
}

我的期望是,点击按钮后,页面会显示&#34; Working&#34;字符串,表示控制器中的函数已正确执行。

然而,这种情况并没有发生,我所看到的只是javascript警告说&#34;错误&#34;。

如何让这个ajax请求有效?我错过了什么?

4 个答案:

答案 0 :(得分:1)

你的控制器方法什么都不返回......

将其转换为以下::

public String Material()
{
    return "Working!";
}

答案 1 :(得分:1)

这不是事情的运作方式。当您响应AJAX请求调用Response.Write时,实际的AJAX响应就是字符串&#34; Working!&#34;。什么都不会被写入页面,除非你把这个字符串并自己添加到DOM的某个地方。

答案 2 :(得分:1)

我在您的代码中看到了3个不正确的内容。

1)[ValidateAntiForgeryToken] 你没有在你的ajax调用中实现它,所以你应该在你的控制器中删除它。 (我不知道如何在JQuery中使用它。)

2)如果您的控制器被调用&#34; MaterialController.cs&#34;如果您尚未更改路线配置,则使用的网址为:&#39; /材料/材料&#39;。

3)你的函数返回&#34; void&#34;。用字符串或ActionResult替换你的void。然后,替换你的&#34; Response.write&#34;通过返回&#34;一些字符串&#34;。

答案 3 :(得分:0)

问题出在Ajax调用中。这是解决方案:

$.ajax({
                url: "Controler/Action",
                type: 'POST',
                contentType: 'application/json; charset=utf-8',
                traditional: true,
                data: JSON.stringify({ requiresSetupArray: requiresSetupArray, disabledArray: disabledArray }),
                success: function (data) {
                    button.attr('value', 'Save Checkbox Changes');
                    button.addClass('disabled');
                },
                error: function () {
                    alert("error");
                }
            });

需要注意的一些事项:

  • Stringify非常重要。没有它,没有任何作用
  • 注意contentType
  • 仔细检查控制器正在考虑的参数!

希望将来帮助某人!