【问题标题】:ASP.NET MVC model binding with serializeASP.NET MVC 模型绑定与序列化
【发布时间】:2015-07-17 10:58:51
【问题描述】:

我正在使用 serializeJSON.stringify 方法对我的 ASP.NET MVC 应用程序进行 Ajax 调用。 MVC 无法绑定模型。

这是我的 JS 代码和强类型视图:

<script>
    function saveDetails() {
        jsonObj = $('#rdform').serialize();
        $.ajax({
            method: "POST",
            url: "R/SaveDetail",
            contentType: 'application/json; charset=utf-8',
            dataType: "json",
            data: JSON.stringify(jsonObj)
        });
    }
</script>

<form id="rdform">
    <div>
        <div>
            @Html.LabelFor(m => m.LiIdH)
            @Html.TextBoxFor(m => m.LiIdH)
        </div>
        <div>
            @Html.LabelFor(m => m.LiIdR)
            @Html.TextBoxFor(m => m.LiIdR)
        </div>
    </div>
    <input type="button" onclick="saveDetails()" />
</form>

请求的负载如下所示:

"LiIdH=1&LiIdD=&LiIdR=2"

这是我的 Action 方法:

public bool SaveDetail(Detail detail)

我错过了什么吗?

【问题讨论】:

  • 你不需要stringify它 - 只需使用data: jsonObj,
  • 在这种情况下,我会收到Invalid JSON primitive 错误。
  • 那么还有其他问题。你确定你已经显示了&lt;form&gt;标签之间的所有html。表单数据包含LiIdD= 的事实表明您没有(属性name="LiIdD" 无法控制)
  • 是的,我很确定。为简洁起见,我删除了一些字段。但我刚刚注意到我的按钮在外面,是我的问题造成的吗?
  • 刚刚注意到您有contentType: 'application/json; charset=utf-8', - 您需要删除该行(除了删除JSON.stringify())。我强烈建议你使用url '@Url.Action("SaveDetail", "R")',

标签: jquery json asp.net-mvc model-binding


【解决方案1】:

您遇到麻烦的原因是您同时使用了序列化和 JSON.stringify。 form.serialize 返回一个字符串值,当传递给 JSON.serialize 时,会用一对额外的引号包裹起来。调用操作方法的最简单方法是删除对 JSON.stringify 的调用,并删除 ajax 调用的 contentType 选项并使用默认值,如下图:

<script>
    function saveDetails() {
        $.ajax({
            method: "POST",
            url: "R/SaveDetail",
            dataType: "json",
            data: $('#rdform').serialize()
        });
    }
</script>

【讨论】:

  • 或者直接省略contentType:,因为默认是'application/x-www-form-urlencoded; charset=UTF-8'
  • 谢谢肖恩,但我应该完全删除contentType。我不知道为什么,但你回答中的contentType 也会导致问题。但如果我删除它,一切正常。
  • 我相信是 'charset....' 造成了麻烦,但你说得对,删除它并坚持使用默认值可能是更好的选择。
  • 肖恩 - 你救了我的命!和发帖人有同样的问题 - 找到了很多帖子,但没有真正的答案。已经尝试了一切,自定义模型绑定器等。但解决方案是如此简单,我从未想过:)
  • 我有一个类似的问题,唯一的区别是我的模型有一个列表,我正在循环创建一个包含在 Html.BeginForm 中的表格,使用 Html.DispayTextFor 显示每一行的文本,但是当我正在使用 $("formElem").serialize 并将其作为数据发送。似乎没有收到填充模型中的列表,有什么帮助吗?
猜你喜欢
  • 2014-01-19
  • 2012-11-13
  • 2011-02-05
  • 2014-04-18
  • 1970-01-01
  • 1970-01-01
  • 2023-03-06
  • 2011-03-04
相关资源
最近更新 更多