asp.net MVC serialize() 在控制器的模型中返回空

本文关键字:模型 返回 控制器 MVC net serialize asp | 更新日期: 2023-09-27 18:35:51

我的cshtml片段:

@model Models.ClockingInformationViewModel
<form id="clocking-form">
                <div class="row">
                    <div class="col-md-4">
                        <div class="form-group">
                            <label class="control-label">Time in</label>
                            <div class="input-group date form_datetime">
                                @Html.TextBoxFor(m => m.Attendance.Time01In, new { @class = "form-control", @readonly = "readonly", size = "16" })
                            </div>
                        </div>
                    </div>
                    <div class="col-md-4">
                        <div class="form-group">
                            <label class="control-label">Job code</label>
                            @Html.TextBoxFor(m => m.Attendance.Time01InJob, new { @class = "form-control" })

控制器:

[HttpPost]
public JsonResult ClockingInformation(ClockingInformationViewModel model)
{
    return null;
}

视图模型:

public class ClockingInformationViewModel
{
    public Attendance Attendance { get; set; }
    public List<Clock> ClockingLocations { get; set; }
}

在我的javascript中,我有这个:

function saveClockingInformation() {
    var data = $("#clocking-form").serialize();
    $.post($("#clocking-info-url").val(), { model: data });
}

当我在控制器中设置断点时,ClockingInformationViewModel model属性为 null。

当我做serializeArray()而不是serialize()时,ClockingInformationViewModel model不是空的,但属性Attendance是。

我敢肯定,这是我忽略了一些愚蠢的错误。

有什么见解吗?

asp.net MVC serialize() 在控制器的模型中返回空

您的var data = $("#clocking-form").serialize();行代码已经将表单序列化为对象,因此代码需要

function saveClockingInformation() {
    var data = $("#clocking-form").serialize();
    $.post($("#clocking-info-url").val(), data);
}

将表单数据发送为

Attendance.Time01In=someValue&Attendance.Time01InJob=anotherValue

而您当前使用 { model: data } 的实现将表单数据作为

model[Attendance.Time01In]=someValue&model[Attendance.Time01InJob]=anotherValue

与您的模型没有关系,因此绑定失败。

旁注:您使用$("#clocking-info-url").val()建议您将 URL 放入隐藏的输入中。相反,请使用

var url = '@Url.Action("yourAction", "yourController")',
$.post($(url, data);

或者,如果您使用 Html.BeginForm() 生成了表单,则使用

var form = $("#clocking-form");
var url = form.attr('action');
$.post($(url, data);