MVC表单Javascript Post在控制器内为空

时间:2016-11-20 19:45:50

标签: javascript asp.net-mvc

我正在使用MVC并在我的视图中有一个表单如下

@using(Html.BeginForm(null, null, FormMethod.Post)) {
    @Html.HiddenFor(m => m.Id)
    @Html.HiddenFor(m => m.SysCreated)
    @Html.HiddenFor(m => m.SysDeleted)

    @Html.TextBoxFor(m => m.Name, new { @class = "form-control" })
    <input typeof="button" value="Create New" onclick="newSchool(this)" class="btn btn-sm btn-primary btn-block btn-signin" style = "margin-bottom:20px" / >
}

我试图使用javascript函数发布此内容,以避免页面刷新。我有以下功能

function newSchool(btnClicked) {
    var $form = $(btnClicked).parents('form');
    var data = $form.serialize();

    console.log(JSON.stringify(data));
    $.ajax({
        url: '@Url.Action("AddSchool", "SetupSchools")',
        type: 'POST',
        contentType: "json",
        data: {
            newSchool: JSON.stringify(data)
        },
        success: function() {
            DevExpress.ui.notify('School Added', 'success', 1500);
        },
        failure: function(xhr, textStatus, errorThrown) {
            DevExpress.ui.notify('Error - ' + XMLHttpRequest.responseText, 'error', 1500);
        },
    });
}

我可以在控制台中看到数据存在并且看起来正确,但是我的控制器中的数据始终为空。我的控制器如下所示

public void AddSchool(Models.School school)
{
}

如何正确发送数据?或者,是否有更好的方式发布数据而不刷新表单。

2 个答案:

答案 0 :(得分:1)

正如某些评论建议的那样,您需要删除contentType: json并使用data: $("form").serialize(),我的个人建议是使用cache: false始终将数据发送到控制器,如果我没弄错,IE用于缓存ajax请求,如果它看起来一样。

这是一个&#34;小提琴&#34;你可以看到它正在使用当前的代码:

https://dotnetfiddle.net/IGaQnt

你的代码应该是这样的:

function newSchool(btnClicked) {
        var $form = $(btnClicked).parents('form');
            var data = $form.serialize();

            console.log(JSON.stringify(data));
            $.ajax({
                url: '@Url.Action("AddSchool", "Home")',
                type: 'POST',
                cache: false,
                data: data,
                success: function(result) {
                    alert(result); //I return the name the user submited, you can do whatever you want here.
                },
                failure: function(xhr, textStatus, errorThrown) {
                    DevExpress.ui.notify('Error - ' + XMLHttpRequest.responseText, 'error', 1500);
                },
            });
        }

我决定使用JsonResult void Model: statements+=(MessageDefinition | MessageUsage)*; MessageDefinition: '[MESSAGE_DEF]' name=ID; MessageUsage: '[MESSAGE_USAGE]' usage=[MessageDefinition]; [MESSAGE_DEF] EXAMPLE_1 [MESSAGE_DEF] EXAMPLE_2 [MESSAGE_USAGE] EXAMPLE_1 ,但我不知道您完整的代码,因此请根据需要进行更改。

答案 1 :(得分:0)

我假设学校在表单上有元素作为属性,所以如果这是正确的,你需要做的是使用$ form.serializeArray()以json格式获取数据并在异步上发送该变量请求。 我认为错误是因为您创建了一个对象newschool并将所有数据分配给该对象,但您在控制器中期望的是数据而不是该对象。