将表单数据序列化为 Ajax POST 的模型

Ste*_*ven 1 c# ajax jquery asp.net-core-mvc

我有一个使用此模型的 MVC Web 应用程序

public class PersonViewModel
{
    public Guid SchoolId { get; set; }
    public string Name { get; set; }        
}

public class StudentViewModel : PersonViewModel
{

}
Run Code Online (Sandbox Code Playgroud)

我有这个控制器方法来获取 StudentViewModel 并在我的数据库中创建一个 Student:

[HttpPost]
public async Task<IActionResult> CreateStudent(StudentViewModel viewModel)
{
    // ... do stuff
}
Run Code Online (Sandbox Code Playgroud)

我正在用我的表单做很多动态 UI 的东西,我可能会用不同的值发布到不同的端点,所以我决定只使用 javascript 提交表单并根据一些条件决定我发布到的位置。

所以这基本上就是我不使用强类型辅助方法走正常路线的原因 - 这就是我认为的:

<form id="form">
    <input name="SchoolId" value="@Model.Id" type="hidden" />

    <input name="Name" type="text" />

    <button type="submit">Create</button>
</form>

<script>

    $(document).ready(function () {

        $('#form').on('submit', function (e) {
            e.preventDefault();            

            var formData = $('#form').serialize()
            console.log(formData);

            $.ajax({
                url: '/CreateStudent',
                type: "POST",
                data: formData,
                contentType: "application/json"
            });
        });

    });

</script>
Run Code Online (Sandbox Code Playgroud)

我可以在控制台日志中看到表单数据已正确序列化,并且它命中了我的控制器方法。但是视图模型参数没有我传递给它的值。

我试过这样设置表单数据:

var formData = JSON.stringify($('#form').serializeArray());
Run Code Online (Sandbox Code Playgroud)

我什至尝试对值进行硬编码:

var formData = '{"SchoolId":"c65fc8ad-7ad2-e811-b37f-9cb6d0b709c2","Name":"Testing"}';
Run Code Online (Sandbox Code Playgroud)

但是无论我尝试什么,都不会设置视图模型值。

我格式化表单数据有误吗?或者有没有完全不同的方式我需要这样做?

小智 7

当你使用.serialize()IE浏览器- ,它在“查询字符串”格式生成的数据SchoolId=someValue&Name=AnotherValue,这需要使用默认的发送contentType'application/x-www-form-urlencoded; charset=UTF-8',还不如JSON。

删除该contentType选项或指定contentType: 'application/x-www-form-urlencoded; charset=UTF-8'

$('#form').on('submit', function (e) {
    e.preventDefault();            
    var formData = $('#form').serialize()
    $.ajax({
        url: '@Url.Action("CreateStudent")', //recommended
        type: "POST",
        data: formData,
        contentType: 'application/x-www-form-urlencoded; charset=UTF-8' // optional
    });
});
Run Code Online (Sandbox Code Playgroud)

请注意,如果您要使用contentType: "application/json",那么您将使用(假设您为输入提供适当的id属性)生成数据

var formData = JSON.stringify({
    SchoolId: $('#SchoolId').val(),
    Name: $('#Name').val(),
})
Run Code Online (Sandbox Code Playgroud)