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

MVC表单Javascript Post在控制器内为空,javascript,asp.net-mvc,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 = "for

我正在使用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" / >
}
我可以在控制台中看到数据在那里并且看起来是正确的,但是我的控制器中的数据总是空的。我的控制器如下所示

public void AddSchool(Models.School school)
{
}

如何正确发送数据?或者,是否有更好的方法在不刷新表单的情况下发布数据。

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

正如一些评论所建议的,您需要删除
contentType:json
并使用
数据:$(“form”).serialize()
,我个人的建议是使用
cache:false
始终将数据发送到控制器(如果我没有弄错的话),即如果ajax请求看起来相同,则用于缓存该请求

这里有一个“提琴”,你可以看到它与你当前的代码一起工作:

您的代码应该是这样的:

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
,我不知道您是否完成了代码,所以请根据需要进行更改。

请注意,该标记用于有关图案的问题。对于有关ASP.NET实现的问题,请使用标记。您可以使用Ajax.BeginForm helper,而不将其字符串化,直接发布它,如:
data:data,
发布后是否也尝试刷新页面?删除
contentType:“json”,
并使用
数据:$('form')。serialize(),
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);
                },
            });
        }